Znaleziono 1 wynik

autor: tuxcnc
08 lis 2020, 17:39
Forum: Arduino, Raspberry pi i inne systemy mikroprocesorowe
Temat: Projekt arduino z czujnikami optycznyni
Odpowiedzi: 13
Odsłony: 2389

Re: Projekt arduino z czujnikami optycznyni

Ja kiedyś z czystych nudów zrobiłem wyjątkowo bajerancki projekt.
Potrzebny jest czujnik https://www.aliexpress.com/item/32730415199.html, moduł BT https://www.aliexpress.com/item/33009632983.html i ATtiny13 (można użyć Arduino, np. Nano).
Bajer polega na tym, że wynik zliczania odczytuje się smartfonem z Androidem, teraz dokładnie nie pamiętam, ale aplikacja to jakiś "serial monitor" albo coś w tym stylu.
Tutaj masz na szybko znaleziony przykład https://create.arduino.cc/projecthub/va ... ino-18eadc
A program na ATtiny 13 wygląda tak :

Kod: Zaznacz cały

#define F_CPU 9600000

#include <avr/io.h>
#include <util/delay.h>

#define SOFT_TX_PIN (1<<PB1) // PB1 as TXD 
#define SOFT_TX_PORT PORTB
#define SOFT_TX_DDR DDRB

unsigned int count = 0; 
char old = 0;
char now = 0;

int main (void) {
  PORTB =1;
  uart_tx_init (); // инициализация прог. UARTа

  while (1) {
    now = (PINB & 1);
    if (old != now ){
      old = now;
        if (old == 1){
          count++;
          uart_print("Current counter value = "); // превед 
          num_to_str(count, 5); // 0..99999
          uart_print("\r\n");  // переход на новую строчку 
        }
      }
    }
  return 0; 
}

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;    // compare mode
  TCCR0B = (1 << CS01);    // prescaler 8
  OCR0A = 125;  // 9600 baudrate at prescaler 8
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
}

// Функция вывода содержимого переменной
void num_to_str(unsigned int value, unsigned char nDigit)
{
  switch (nDigit)
  {
  case 5:
    uart_send_byte((value / 10000) + '0');
  case 4:
    uart_send_byte(((value / 1000) % 10) + '0');
  case 3:
    uart_send_byte(((value / 100) % 10) + '0');
  case 2:
    uart_send_byte(((value / 10) % 10) + '0');
  case 1:
    uart_send_byte((value % 10) + '0');
  }
}

void uart_print(char *str)
{
  byte i = 0;
  while (str[i]) {
    uart_send_byte(str[i++]);
  }
}

//bitbanged UART transmit byte
void uart_send_byte (unsigned char data)
{
  unsigned char i;
  TCCR0B = 0;
  TCNT0 = 0;
  TIFR0 |= 1 << OCF0A;
  TCCR0B |= (1 << CS01);
  TIFR0 |= 1 << OCF0A;
  SOFT_TX_PORT &= ~SOFT_TX_PIN;
  while (!(TIFR0 & (1 << OCF0A)));
  TIFR0 |= 1 << OCF0A;
  for (i = 0; i < 8; i++)
  {
    if (data & 1)
      SOFT_TX_PORT |= SOFT_TX_PIN;
    else
      SOFT_TX_PORT &= ~SOFT_TX_PIN;
    data >>= 1;
    while (!(TIFR0 & (1 << OCF0A)));
    TIFR0 |= 1 << OCF0A;
  }
  SOFT_TX_PORT |= SOFT_TX_PIN;
  while (!(TIFR0 & (1 << OCF0A)));
  TIFR0 |= 1 << OCF0A;
}
Komentarzami się nie przejmuj, przerabiałem coś znalezione w necie.
Skomplikowanie programu wynika z prostoty mikrokontrolera, ma tak mało zasobów, że trzeba wszystko pisać ręcznie. Na Arduino można użyć sprzętowego UART-a i gotowych bibliotek.

Wróć do „Projekt arduino z czujnikami optycznyni”