Posts tagged Arduino UNO

Trasmissione di 2 bit tramite infrarossi

2

Come annunciato nell’articolo precedente, ho cominciato a lavorare con le comunicazioni a infrarossi. Ho realizzato un piccolo progettino che consente l’invio di due bit da un Arduino (stand alone su breadboard) ad un’altro Arduino (sulla board UNO) che riceve i dati e li visualizza al pc tramite il serial monitor.

Tramite due deviatori posso stabilire il valore dei due bit (0 – GND o 1 – VCC).

Il protocollo, se così si può definire, è rappresentato nella seguente figura:

Inizialmente il trasmettitore invia una richiesta di attenzione che dura 100 ms (invia una frequenza di 38KHz che viene rilevata dal ricevitore), il ricevitore controlla se effettivamente si tratta della richiesta di invio dati (se riceve un valore alto per più di 85ms si tratta della richiesta), successivamente il trasmettitore invia il primo bit per 50 ms, il ricevitore dopo aver atteso per 125 ms (si troverà esattamente a 25ms dall’inizio della trasmissione del primo bit) ne leggerà il valore immagazinandolo nella variabile “val1″, successivamente lo stesso avviene per il secondo bit.

Se entrambi i bit sono a “1″ il led nella scheda Arduino (al pin 13) si accenderà.

N.B.

Il ricevitore funziona con una logica negata, ovvero, quando legge una frequenza di 38KHz da in uscita un valore logico basso (0), viceversa quando non legge nulla da in uscita un valore logico alto (1).

Ecco il video della realizzazione:

 

Sorgente trasmettitore:

/* Test di trasmissioni a infrarossi tramite XP (Xfox's Protocol)
 Invio di 2 bit
 -----------------
 Trasmettitore |
 -----------------   */
int bit1 = 2;
int bit2 = 3;
int out = 5;

int val1 = 0;
int val2 = 0;

int freq[] = {
  0, 38000};

void setup(){
  pinMode(bit1, INPUT);
  pinMode(bit2, INPUT);
  pinMode(out, OUTPUT);
}

void loop(){
  val1 = digitalRead(bit1);
  val2 = digitalRead(bit2);
  //Inizio comunicazione, richiesta di attenzione da parte del ricevitore
  tone(out, freq[1]);
  delay(100);
  noTone(out);
  delay(100);

  tone(out,freq[val1]);
    delay(50);
  noTone(out);

  tone(out, freq[val2]);
    delay(50);
  noTone(out);
}

Sorgente ricevitore:

/* Test di trasmissioni a infrarossi tramite XP (Xfox's Protocol)
 Invio di 2 bit
 -----------------
 Ricevitore |
 -----------------   */

int in = 2;

int val1 = 0;
int val2 = 0;

long temp1 = 0;
long temp2 = 0;
long wait = 0;

void setup(){
  pinMode(in, INPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop(){
  temp1 = 0;
  temp2 = millis();
  while (digitalRead(in) == 0){
    temp1 = millis() - temp2;
  }

  if (temp1 > 85){
    delay(125);
    val1 = !digitalRead(in);
    delay(50);
    val2 = !digitalRead(in);
  }

  if((val1 == 1) && (val2 == 1))
    digitalWrite(13, HIGH);
  else
    digitalWrite(13, LOW);

  scrivi();

}

void scrivi(){
  if(wait < millis()){
    wait = millis() + 100;
    Serial.print("Temp1: ");
    Serial.print(temp1);
    Serial.print("\tVal1 :");
    Serial.print(val1);
    Serial.print("\tVal2: ");
    Serial.println(val2);
  }
}

Il tutto è realizzato con due ricetrasmettitori ad infrarossi di un vecchio robot della DeAgostini (come detto nell’articolo precedente).

La cosa potrebbe farsi più interessante sfruttando questi componenti sia come trasmettitori che ricevitori, mentre nel mio progetto ho utilizzato ogni componente o come trasmettitore o come ricevitore. Adesso cercherò di creare un protocollo vero e proprio che mi permetta di inviare un byte alla volta in tempi più brevi.

Prossimo passo: sensore di distanza

0

Ultimamente mi sono dedicato all’Xfox’s Robot, ancora in versione di sperimentazione poichè non è in grado di eseguire operazioni autonomamente. Avevo pensato di aggiungere due foto-resistenze (le stesse del progetto “Arduino UNO – Inseguitore di luce“) per far si che il robot seguisse la luce, devo dire che sono riuscito con risultati abbastanza soddisfacenti anche se non molto accurati.

Il prossimo passo sarà utilizzare dei sensori di distanza (ad infrarossi o ad ultrasuoni) per rendere il robot autonomo.

 

Cambiando un’attimo argomento, mi sono ritrovato a casa dei ricetrasmettitori ad infrarossi di un vecchio robot della Deagostini, li utilizzerò per cominciare a fare qualche lavoretto con le trasmissioni senza fili (oltre ovviamente il modulo xBee).

Scheda UC3 – IR TX-RX Robot

Scheda UC1-IR TX-RX – Telecomando

Arduino UNO – Inseguitore di luce

2

Ecco il mio primo progetto Arduino con ServoMotore. :D

Inseguitore di luce, è questo il nome della mia nuova creazione, in sostanza, due fotoresistenze mi rilevano i valori di luce e ne fanno la media, se la media è inferiore ad un certo valore (dipende dall’ambiente in cui si utilizza) ed il valore di differenza fra i due sensori di luce (fotoresistenze) è maggiore a 150, il servomotore si sposta dalla parte più luminosa.

Ecco il link del video:

Arduino UNO – Inseguitore di luce

Di seguito il codice:

//Inseguitore di luce by Xfox
#include <Servo.h> //Includo libreria per i servomotori
Servo myservo; //Creo oggetto myservo
//Pin di ingresso
const int sensore_l = A0;
const int sensore_r = A1;
//Variabili di lavoro
int valore_l = 0;
int valore_r = 0;
int pos = 90;
int passo = 10;
int media = 0;
int tempo_azionamento = 50;
//Variabili temporali
int tempo = 0;
int ritardo = 0;
void setup(){
Serial.begin(9600); //Inizializzazione seriale
//Definizione dei pin
pinMode(sensore_l, INPUT);
pinMode(sensore_r, INPUT);
//Inizializzazione servomotore
myservo.attach(3);
myservo.write(pos);
}
void loop(){
//Lettura sensori e calcolo media
valore_l = analogRead(sensore_l);
valore_r = analogRead(sensore_r);
media = (valore_l + valore_r) / 2;
mostra_seriale();
if (media > 200){
if (((valore_l – valore_r) > 150) || ((valore_l – valore_r) < -150)){
if (valore_l < valore_r){ //più luce sul sensore sinistro
pos = pos + passo;
myservo.write(pos);
delay(tempo_azionamento);
if (pos > 180){
pos = 180;
}
}
else{                     //più luce sul sensore destro
pos = pos – passo;
myservo.write(pos);
delay(tempo_azionamento);
if (pos < 0){
pos = 0;
}
}
}
}
}
void mostra_seriale(){
tempo = millis();
if (tempo > ritardo){
ritardo = millis() + 1000;
Serial.print(“Sensore sinistro: “);
Serial.print(valore_l);
Serial.print(”          Sensore destro: “);
Serial.print(valore_r);
Serial.print(”          Media valori: “);
Serial.print(media);
Serial.print(”          Servo in posizione: “);
Serial.println(pos);
}
}

Contapersone by Xfox

0

Come avevo promesso negli articoli precedenti, ho finalmente realizzato il video del programma “contapersone”.

Il codice è cambiato un pochino e ho aggiunto un display LCD che visualizza il totale delle persone presenti.

Ecco il video:

http://www.youtube.com/watch?v=gsTIoOBkCgI

Arduino UNO – Supercar LED

0

Nell’articolo precedente avevo annunciato l’arrivo del fantastico Arduino UNO, dopo 3 giorni è finalmente arrivato.

Il programma che avevo scritto funziona (anche se non ho potuto ancora fare un video del funzionamento, ma lo farò al più presto), nel frattempo ho scritto un’altro programmino. :)

Sicuramente tutti conoscono supercar, ricordate le lucette che facevano avanti e indietro? Beh, ho realizzato lo stesso effetto, con la differenza che la velocità è regolabile tramite una manopola oppure tramite il computer.

Ecco il video:

Arduino UNO – Supercar LED

Putroppo il video non è dei migliori ma in linea di massima si capisce.

Di seguito il codice:

/* Le velocità vanno da 1 a 5 (rispettivamente 1 e 5 millisecondi di pausa tra un pass ed un’altro),
inviando tramite il serial monitor il numero “9″ si passa il comando da SERIALE a POTENZIOMETRO,
una volta che il comando e impostato su SERIALE si può inviare il valore numerico (da 1 a 5)
della velocità che si vuole impostare. */
//Definizioni led pin
const int led1 = 11;
const int led2 = 10;
const int led3 = 9;
const int led4 = 6;
const int led5 = 5;
const int led6 = 3;
const int pot = A0;
//Definizioni variabili
int passo = 5;
int lum1 = 0;
int lum2 = 0;
int lum3 = 0;
int lum4 = 0;
int lum5 = 0;
int lum6 = 0;
int vel = 0;
int c = 49;
int comando = 1; //0 comando al seriale, 1 comando al pot
int ciclo = 0;
void setup(){
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(pot, INPUT);
Serial.begin(9600);
}
void loop(){
if (Serial.available() > 0){
c = Serial.read();
if (c == 57){
if (comando == 1){
comando = 0;
Serial.println(”                       Comando da seriale”);
}
else{
comando = 1;
Serial.println(”                      Comando da potenziometro”);
}
}
}
if (comando == 0){
switch(c){
case 49:
vel = 1;
break;
case 50:
vel = 2;
break;
case 51:
vel = 3;
break;
case 52:
vel = 4;
break;
case 53:
vel = 5;
break;
default:
c = c;
break;
}
}
else{
vel = map(analogRead(pot), 0, 1023, 1, 5);
}
Serial.print(“Velocita da 1 a 5: “);
Serial.print(vel);
Serial.print(“………………Ciclo numero: “);
Serial.println(ciclo);
for(lum1 = 0; lum1 < 255; lum1+=passo){
analogWrite(led1, lum1);
delay(vel);
}
for(lum2 = 0; lum2 < 255; lum2+=passo){
analogWrite(led2, lum2);
delay(vel);
}
for(lum3 = 0; lum3 < 255; lum3+=passo){
analogWrite(led3, lum3);
delay(vel);
}
for(lum4 = 0; lum4 < 255; lum4+=passo){
analogWrite(led4, lum4);
delay(vel);
}
for(lum5 = 0; lum5 < 255; lum5+=passo){
analogWrite(led5, lum5);
delay(vel);
}
for(lum6 = 0; lum6 < 255; lum6+=passo){
analogWrite(led6, lum6);
delay(vel);
}
for(lum1 = 255; lum1 >= 0; lum1-=passo){
analogWrite(led1, lum1);
delay(vel);
}
for(lum2 = 255; lum2 >= 0; lum2-=passo){
analogWrite(led2, lum2);
delay(vel);
}
for(lum3 = 255; lum3 >= 0; lum3-=passo){
analogWrite(led3, lum3);
delay(vel);
}
for(lum4 = 255; lum4 >= 0; lum4-=passo){
analogWrite(led4, lum4);
delay(vel);
}
for(lum5 = 255; lum5 >= 0; lum5-=passo){
analogWrite(led5, lum5);
delay(vel);
}
for(lum6 = 255; lum6 >= 0; lum6-=passo){
analogWrite(led6, lum6);
delay(vel);
}
for(lum6 = 0; lum6 < 255; lum6+=passo){
analogWrite(led6, lum6);
delay(vel);
}
for(lum5 = 0; lum5 < 255; lum5+=passo){
analogWrite(led5, lum5);
delay(vel);
}
for(lum4 = 0; lum4 < 255; lum4+=passo){
analogWrite(led4, lum4);
delay(vel);
}
for(lum3 = 0; lum3 < 255; lum3+=passo){
analogWrite(led3, lum3);
delay(vel);
}
for(lum2 = 0; lum2 < 255; lum2+=passo){
analogWrite(led2, lum2);
delay(vel);
}
for(lum1 = 0; lum1 < 255; lum1+=passo){
analogWrite(led1, lum1);
delay(vel);
}
for(lum6 = 255; lum6 >= 0; lum6-=passo){
analogWrite(led6, lum6);
delay(vel);
}
for(lum5 = 255; lum5 >= 0; lum5-=passo){
analogWrite(led5, lum5);
delay(vel);
}
for(lum4 = 255; lum4 >= 0; lum4-=passo){
analogWrite(led4, lum4);
delay(vel);
}
for(lum3 = 255; lum3 >= 0; lum3-=passo){
analogWrite(led3, lum3);
delay(vel);
}
for(lum2 = 255; lum2 >= 0; lum2-=passo){
analogWrite(led2, lum2);
delay(vel);
}
for(lum1 = 255; lum1 >= 0; lum1-=passo){
analogWrite(led1, lum1);
delay(vel);
}
ciclo++;
}

Arduino UNO

0

Da qualche giorno sono in attesa dell’arduino UNO (immagine a sinistra)

Arduino Uno è una scheda elettronica basata sul microcontrollore Atmega328.

Dispone di 14 linee di ingresso/uscita digitali di cui 6 possono essere utilizzate come uscite PWM, 6 ingressi analogici, un’oscillatore a 16 MHz, una connesione USB e molto altro.

Si programma in C ed utilizza un programma davvero semplice ed intuitivo da utilizzare (reperibile qui: Download the Arduino Software).

Tramite la sezione Learning del sito di arduino è semplicissimo capire come funziona quest’ultimo.

Ecco un programmino che ho scritto (ancor prima di avere l’arduino fra le mani :P), in poche parole conta quante persone ci sono in una stanza (monitora le persone che escono o che entrano e mostra il numero al computer).

//Definizione dei pin
const int led = 13;
const int RX1 = 12;
const int RX2 = 11;
//Inizializzazione delle variabili del programma
long milliscorrenti = 0;
long ritardo = 0;
long intervallo = 5000; // 5 Secondi espressi in millisecondi
long millis_led = 0;
long ritardo_led = 0;
long intervallo_led = 500; // 0.5 Secondi espressi in millisecondi
int contapersone = 0; //Variabile contapersone
void setup() {
//Definizione input e output
pinMode(RX1, INPUT);
pinMode(RX2, INPUT);
pinMode(led, OUTPUT);
//Inizializzazione comunicazione seriale
Serial.begin(9600);
//Inizializzazione led
digitalWrite(led, LOW);
}
void loop() {
//Se il RX1 assume valore basso ed RX2 assume valore alto significa che si sta entrando
if ((digitalRead(RX1) == LOW) && (digitalRead(RX2) == HIGH)){
ritardo = millis() + intervallo;
for(milliscorrenti = 0; milliscorrenti < ritardo; milliscorrenti=millis()){
if(digitalRead(RX2) == LOW){
contapersone++;
Serial.println(“Persone in entrata, totale : “);
Serial.println(contapersone, DEC);
digitalWrite(led, LOW);
break;
}
millis_led=millis();
if (millis_led > ritardo_led){
ritardo_led=millis() + intervallo_led;
if (digitalRead(led) == LOW)
digitalWrite(led, HIGH);
else
digitalWrite(led, LOW);
}
}
digitalWrite(led, LOW);
}
//Se il RX1 assume valore alto ed RX2 assume valore basso significa che si sta uscendo
if((digitalRead(RX1) == HIGH) && (digitalRead(RX2) == LOW)){
ritardo = millis() + intervallo;
for(milliscorrenti = 0; milliscorrenti < ritardo; milliscorrenti=millis()){
if(digitalRead(RX1) == LOW){
contapersone–;
Serial.println(“Persone in uscita, totale : “);
Serial.println(contapersone, DEC);
digitalWrite(led, LOW);
break;
}
millis_led=millis();
if (millis_led > ritardo_led){
ritardo_led=millis() + intervallo_led;
if (digitalRead(led) == LOW)
digitalWrite(led, HIGH);
else
digitalWrite(led, LOW);
}
}
digitalWrite(led, LOW);
}
}
//Contapersone by Xfox

Non appena realizzerò questo progetto posterò un video.

Ecco le caratteristiche tecniche dell’arduino UNO:

  • Microcontrollore: ATmega328
  • Tensione di funzionamento: 5 V
  • Tensione di alimentazione (raccomandata): da 7 a 12 V
  • Tensione di alimentazione (limiti): 6-20V
  • Ingressi/uscite Digitali: 14 (di cui 6 possono essere utilizzate come uscite PWM)
  • Ingressi analogici: 6
  • Corrente Dc per pin I/O: 40 mA
  • Corrente DC per pin 3,3 V: 50 mA
  • Memoria Flash: 32 kB (di cui 0,5 kB utilizzati dal bootloader)
  • SRAM: 2 kB
  • EEPROM: 1 kB
  • Velocità di Clock : 16 MHz

Go to Top