Operácie

Snímanie polohy optickým enkodérom

Zo stránky SensorWiki

Záverečný projekt predmetu MIPS / LS2025 - Lukáš Čapla


Zadanie

Cieľom projektu je snímanie polohy natočenia optickým rotačným enkóderom, a túto polohu vypísať sériovú komunikáciu na počítač.

PinOut dosky Arduino nano.

Literatúra:


Analýza a opis riešenia

V zadaní použijeme optický rotačný enkodér (LPD3806-600BM Rotary Encoder 600 Pulse NPN) teda 600 pulzov na jednu otáčku hriadeľa.

LPD3806-600BM.

Schéma zapojenia

Schéma zapojenia.

Signály A a B rotačného enkóderu.

Signály rotačného enkóderu.

zdroj: https://www.makerguides.com/quadrature-rotary-encoder-with-arduino/


Algoritmus a program

Algoritmus programu využíva prerušenia, pretože inak by sa mohlo stať, že niektoré signály procesor nespracuje. Teda použijeme piny PD2 a PD3 ako vstupy so zapnutými prerušeniami v sledovaní nábežnej hrany.


#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include "uart.h"
#include <util/delay.h>


volatile long counter = 0;
volatile long temp = 0;


/* Pripojenie periferii k vyvojovej doske Arduino: */

#define BAUD 9600

#define pinA PD7
#define pinA PD7


#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))




FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);

// External Interrupt 0 (INT0) Handler (PD2)
ISR(INT0_vect) {
	if (!(PIND & (1 << PIND3))) {
		counter++;
		} else {
		counter--;
	}
}

// External Interrupt 1 (INT1) Handler (PD3)
ISR(INT1_vect) {
	if (!(PIND & (1 << PIND2))) {
		counter--;
		} else {
		counter++;
	}
}



int main(void) {
	
	uart_init();                  // Inicializacia seriovej linky
	stdout = &mystdout;           // Odteraz funguje printf();
	
	// Set PD2 and PD3 as inputs with pull-up
	DDRD &= ~((1 << DDD2) | (1 << DDD3));      // Inputs
	PORTD |= (1 << PORTD2) | (1 << PORTD3);    // Enable pull-up resistors

	uart_init();

	// Enable external interrupts on INT0 and INT1 on rising edge
	EICRA |= (1 << ISC01) | (1 << ISC00);  // INT0: Rising edge
	EICRA |= (1 << ISC11) | (1 << ISC10);  // INT1: Rising edge

	EIMSK |= (1 << INT0) | (1 << INT1);    // Enable INT0 and INT1

	sei(); // Enable global interrupts

	while (1) {
		if (temp != counter) {
			temp = counter;
			printf("natocenie: %ld rychlost: 0\r",counter);
		}
	}

	return 0;
}

Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:

Zdrojový kód: zdrojaky.zip

Overenie

Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku hotového zariadenia.

Aplikácia.

Video:



Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.