domenica 8 novembre 2015

Bottoni letti da ingresso analogico

Quattro bottoni letti da ingresso analogico con Debouce:


Su amazon vendono lcd shield con 4 bottoni in ingresso analogico.
Così ho costruito uno sketch per quel modulo.

Collegamenti:

Da vedere sulla shield comprata, comunque per lo sketch che ho scritto:
Lcd da collegare ai pin 2, 3, 4, 5, 11, 12.
I 4 bottoni al pin A0.
Sull'Arduino Basic Control c'è lo schema per il collegamento dei bottoni per ingresso analogico.

Codice Arduino: Version 1.0 (stabile e testata)


#include <LiquidCrystal.h>
int debounce = 200;  //Tempo di rimbalzo
int readingOk;
int readingEsc;
int readingUp;
int readingDown;//Lettura corrente del pin INPUT PULSANTE
int previousOk = LOW;  //Lettura precedente del pin INPUT PULSANTE
int previousEsc = LOW;
int previousUp = LOW;
int previousDown = LOW;
long timeOk = 0;  //Ultimo tempo in cui il pin di OUTPUT è stato attivato
long timeEsc = 0;
long timeUp = 0;
long timeDown = 0;
int bottonepremuto = 0;
int LetturaValoreBottone = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup()
{
     Serial.begin(9600);
     lcd.begin(16, 2);
}

void loop()
{
  leggiBottoniAnalog();
  if (bottonepremuto > 0)
  {
    Serial.println(bottonepremuto);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(bottonepremuto);
  }
}

void leggiBottoniAnalog(){

  bottonepremuto = 0; //azzero bottone premuto se no continua ad essere così anche finito di premere il tasto
  LetturaValoreBottone = analogRead(A0);

  if (LetturaValoreBottone > 50 && LetturaValoreBottone < 150)
  {
    readingOk = LOW;
    readingEsc = HIGH;
    readingUp = LOW;
    readingDown = LOW;
  }    
  else if (LetturaValoreBottone > 150 && LetturaValoreBottone < 250)
  { 
    readingOk = LOW;
    readingEsc = LOW;
    readingUp = LOW;
    readingDown = HIGH;
  }    
  else if (LetturaValoreBottone > 250 && LetturaValoreBottone < 350)
  {
    readingOk = LOW;
    readingEsc = LOW;
    readingUp = HIGH;
    readingDown = LOW;
  }
  else if (LetturaValoreBottone > 350)
  {
    readingOk = HIGH;
    readingEsc = LOW;
    readingUp = LOW;
    readingDown = LOW;
  }
  else
  {
    readingOk = LOW;
    readingEsc = LOW;
    readingUp = LOW;
    readingDown = LOW;
  }
  
  
  
  
  //Se abbiamo premuto in pulsante (HIGH) e la volta prima il suo stato
  //era LOW ed è trascorso il tempo necessario, allora...
  
  if (readingOk == HIGH && previousOk == LOW && millis() - timeOk > debounce) {
      //Ricorda quando l'ultima volta è stato premuto il pulsante  
      timeOk = millis();
      bottonepremuto=1;
  }
  
  if (readingEsc == HIGH && previousEsc == LOW && millis() - timeEsc > debounce) {
    //Ricorda quando l'ultima volta è stato premuto il pulsante  
    timeEsc = millis();
    bottonepremuto=4;
  }
  
  if (readingUp == HIGH && previousUp == LOW && millis() - timeUp > debounce) {
    //Ricorda quando l'ultima volta è stato premuto il pulsante  
    timeUp = millis();
    bottonepremuto=2;
  }
   
   if (readingDown == HIGH && previousDown == LOW && millis() - timeDown > debounce) {
     //Ricorda quando l'ultima volta è stato premuto il pulsante  
     timeDown = millis();
     bottonepremuto=3;
   }

  previousOk = readingOk;
  previousEsc = readingEsc;
  previousUp = readingUp;
  previousDown = readingDown;
}

domenica 25 ottobre 2015

CODICI INFRAROSSI

Codici infrarossi con arduino:


Collegamenti del mio ricevitore IR visto di fronte (sono tutti diversi tra loro, se le spie si spengono sull'arduino stiamo tostando il nostro ricevitore):

Pin a sinistra: dati
Pin al centro: GND
Pin a destra: Vcc

Codice Arduino per ricevere dati infrarossi:


#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  }
    else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  }
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  }
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  }
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == JVC) {
    Serial.print("Decoded JVC: ");
  }
  else if (results->decode_type == PANASONIC) {
    Serial.print("Decoded Panasonic: ");
  }
  Serial.print(results->value, HEX);
  Serial.print("(");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("#define Something_DEC ");
  Serial.println(results->value, DEC);
  Serial.print("#define Something_HEX ");
  Serial.println(results->value, HEX);
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");
  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    } 
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}

void loop() {
  if (irrecv.decode(&results)) {
    dump(&results);
    irrecv.resume(); // Receive the next value
  }

}


Nel monitor seriale dovremmo vedere codici come questi premendo i tasti del telecomando:

Unknown encoding: 731A3E02(32 bits)
#define Something_DEC 1931099650
#define Something_HEX 731A3E02
Raw (68): -6650 4500 -4450 550 -1700 500 -1700 550 -1700 500 -600 550 -550 550 -600 500 -600 500 -600 550 -1700 500 -1700 550 -1650 550 -600 500 -600 550 -550 550 -550 600 -550 550 -1650 550 -550 600 -550 550 -1650 550 -550 600 -550 550 -550 550 -550 550 -550 600 -1650 600 -1600 600 -550 550 -1650 600 -1650 550 -1650 600 -1650 550


Codice Arduino per inviare dati infrarossi:

Riporto qui un esempio di come inviare codici presi dal mio telecomando Samsung


#include "IRremote.h"

IRsend irsend;

void setup()
{
  Serial.begin(9678);
}

unsigned int SOURCE [68]={4500,4450,550,1700,550,1650,550,1650,550,600,550,550,550,550,550,550,550,600,550,1650,550,1700,550,1650,550,550,550,550,550,600,550,550,550,550,550,1700,550,550,550,550,550,550,550,600,550,550,550,550,550,550,550,550,550,1700,550,1650,550,1700,550,1650,550,1700,550,1650,550,1700,550,};
unsigned int OK [68]={4500,4450,550,1650,600,1600,600,1650,600,500,600,500,600,550,550,550,550,550,600,1650,550,1650,600,1600,600,550,550,550,600,500,600,500,600,550,550,550,550,550,600,500,600,1650,550,550,600,1600,600,1650,600,500,600,1650,550,1650,600,1650,550,550,550,1650,600,500,600,550,550,1650,600,};
unsigned int UNO [68]={4550,4400,600,1600,600,1650,550,1650,550,600,550,550,550,550,550,550,550,550,600,1650,550,1650,550,1700,550,550,550,550,550,600,550,550,550,550,550,550,550,550,600,1650,550,550,550,550,550,600,550,550,550,550,550,1650,600,1650,550,550,550,1700,550,1650,550,1700,550,1650,600,1650,550,};
unsigned int DUE [68]={4550,4400,600,1600,600,1650,550,1650,600,550,550,550,550,550,600,500,600,550,550,1650,600,1600,600,1650,550,550,600,500,600,550,550,550,550,550,550,1700,550,550,550,1650,600,550,550,550,550,550,550,550,600,500,600,550,550,1650,600,500,600,1650,550,1650,600,1650,550,1650,550,1700,550,};
unsigned int QUATTRO [68]={4450,4450,500,1750,500,1700,500,1750,500,600,500,600,500,650,450,600,550,550,600,1650,500,1750,500,1650,550,600,550,600,500,600,500,600,500,600,550,550,550,600,550,550,500,1700,550,550,600,500,550,600,500,600,550,1700,500,1700,550,1700,500,550,550,1700,550,1650,550,1700,550,1700,500,};

unsigned int ALTO [68]={4500,4450,550,1650,600,1600,600,1650,600,500,600,500,600,550,550,550,550,550,600,1600,600,1650,600,1600,600,550,550,550,600,500,600,500,600,550,550,550,550,550,600,500,600,500,600,550,550,1650,600,1650,550,550,550,1650,600,1650,550,1650,600,1650,550,1650,600,500,600,500,600,1650,600,};
unsigned int DESTRA [68]={4550,4400,600,1650,550,1650,600,1650,550,550,550,550,600,500,600,500,600,550,550,1650,600,1650,550,1650,600,500,600,550,550,550,550,550,600,500,600,500,600,1650,550,550,600,500,600,550,550,1650,600,1600,600,550,550,1650,600,500,600,1650,550,1650,600,1650,550,550,550,550,600,1650,550,};
unsigned int SINISTRA [68]={4500,4450,550,1650,550,1650,550,1700,550,550,550,550,550,600,550,550,550,550,550,1650,550,1700,550,1650,550,600,550,550,550,550,550,550,550,550,550,1700,550,550,550,1700,550,550,550,550,550,1650,550,1700,550,550,550,550,550,1700,550,550,550,1650,550,1700,550,550,550,550,550,1700,550,};
unsigned int BASSO [68]={4500,4450,550,1650,550,1650,550,1700,550,550,550,550,550,600,550,550,550,550,550,1650,600,1650,550,1650,550,600,550,550,550,550,550,550,550,600,550,1650,550,550,550,550,550,600,550,550,550,1650,550,1700,550,550,550,550,550,1700,550,1650,550,1700,550,1650,550,550,550,550,550,1700,550,};
unsigned int VOLUMESU [68]={4500,4450,550,1650,600,1650,550,1650,600,500,600,500,600,550,550,550,600,500,600,1650,550,1650,600,1600,600,550,550,550,600,500,600,500,600,550,550,1650,600,1600,600,1650,600,500,600,500,600,550,550,550,550,550,600,500,600,550,550,550,550,1650,600,1650,550,1650,600,1650,550,1650,600,};
unsigned int VOLUMEGIU [68]={4500,4450,550,1650,600,1650,550,1650,600,500,600,550,550,550,550,550,600,500,600,1650,550,1650,600,1650,550,550,550,550,600,500,600,550,550,550,550,1650,600,1650,550,550,550,1650,600,550,550,550,550,550,600,500,600,500,600,550,550,1650,600,500,600,1650,550,1650,600,1650,550,1650,600,};


void loop() {
 delay(5000);
 irsend.sendRaw(DUE,68,38);
 delay(1000);
 irsend.sendRaw(QUATTRO,68,38);
 delay(10000);
 }

Riporto ora un esempio di come inviare



Codice Arduino per ricevere alcuni determinati codici infrarossi:

In questo codice attiveremo l'uscita 12 di arduino quando riceveremo un certo codice infrarossi, il seguente

Unknown encoding: C26BF044(32 bits)
#define Something_DEC 3261853764
#define Something_HEX C26BF044

Raw (68): 4446 4500 -4450 eccetera eccetera...

Qui il codice per attivare l'uscita ricevuto il nostro DETERMINATO codice IR (aggiungiamo semplicemente "0x" al codice esadecimale):

#include <IRremote.h>

//il codice seguente è per ricevere dati sul led infrarossi ricevente
int receiver =7 ;
IRrecv irrecv(receiver);
decode_results results; 
boolean noresult = false;

void setup() {
    Serial.begin(9600); 
    irrecv.enableIRIn(); 
}

void loop() 
{  
  leggiSensoreIR();
  if (results.value == 0xC26BF044 && noresult == false) //premuto tasto avanti
  {
    digitalWrite(12, HIGH);
  }
}
  
void leggiSensoreIR(){
  if (irrecv.decode(&results)) {
      Serial.println(results.value, HEX); 
      irrecv.resume();
      noresult = false;
      Serial.println(noresult);
  }else{
      noresult = true;
  }


}



mercoledì 28 gennaio 2015

Macchinina telecomandata via Bluetooth:

I miei due nipoti hanno perso il telecomando e la batteria di una macchinina telecomandata e perso una molla dello sterzo, ricostruito la molla con del fil di ferro spesso ho buttato e ricostruito tutta la parte elettronica.

Ho utilizzato:

1 Arduino (io ho utilizzato il mini pro versione tarocca cinese dal costo irrisorio)
1 modulo bluetooth HC-06
1 ponte H (che arriva fino a 800 mA, insufficienti per alimentare il motore avanti/indietro che assorbe circa 2 Ampere)
1 ponte H costruito da me con 2 Relè e 2 transistor per il motore avanti/indietro
Nel mio caso anche la batteria (ho comprato due lipo da una cella ciascuna 300mAh 35C 3,7V da mettere in serie)
Breadboard, cavetteria, ecc
Per l'applicazione bluetooth da usare per pilotare la macchinina contattatemi e ve la spedirò in qualche modo.

Codice Arduino: Version 1.0 (stabile e testata)

#include <SoftwareSerial.h>
SoftwareSerial mySerial(3,2); //RX, TX

//per ricevere valori bluetooth
char val;
char badval;
char valCost; //valore costante che si mantiene, al contrario di val che poi torna ad essere quella specie di "y"

//pin collegati al modulo ultrasuoni
const int TRIG_PIN = 12;
const int ECHO_PIN = 13;

//motor driver
const int AIA = 5;  // (pwm) pin 9 connected to pin A-IA
const int AIB = 6;  // (pwm) pin 5 connected to pin A-IB
const int BIA = 11; // (pwm) pin 10 connected to pin B-IA
const int BIB = 10;  // (pwm) pin 6 connected to pin B-IB

boolean noresult = false;

//temporizzazione per muovere sx o dx
long unsigned int time = millis();
int intervallo = 1000;
boolean azionatotempo = false;
//per ricevere dati ultrasuoni (funzione antiurto)
long durata, distanza;

byte speed = 255;

void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);
  badval = mySerial.read();
 
  pinMode(AIA, OUTPUT); // set pins to output
  pinMode(AIB, OUTPUT);
  pinMode(BIA, OUTPUT);
  pinMode(BIB, OUTPUT);
}

void loop()
{
  riceviValori();
  if (val != badval)
  {
    valCost = val;
  }
 
  Serial.println("Valcost vale:");
  Serial.println(valCost);
 
  if (valCost == 's' || valCost == badval)
  {
    //disaziono motore avanti/indietro
    disazionoAR();
    disazionoDXSX();
    azionatotempo = false;
  }else if (valCost == 'a')
  {
    //muovo a sx temporizzato
    if (azionatotempo == false)
    {
      time = millis();
      azionatotempo = true;
    }
    if (millis()-time<intervallo)
    {
      //controllo che il motore non sia gia a sx
      sinistra();
    }else
    {
      disazionoDXSX();
    }
    avanti();
  }
  else if (valCost == 'b') //avanti
  {
    avanti();
  }
  else if (valCost == 'c') //avanti a destra
  {
    if (azionatotempo == false)
    {
      time = millis();
      azionatotempo = true;
    }
    if (millis()-time<intervallo)
    {
      //controllo che il motore non sia gia a dx
      destra();
    }else
    {
      disazionoDXSX();
    }
    avanti();
  }
  else if (valCost == 'd') //sinistra
  {
    if (azionatotempo == false)
    {
      time = millis();
      azionatotempo = true;
    }
    if (millis()-time<intervallo)
    {
      //controllo che il motore non sia gia a sx
      sinistra();
    }else
    {
      disazionoDXSX();
    }
  }
  else if (valCost == 'e') //destra
  {
    if (azionatotempo == false)
    {
      time = millis();
      azionatotempo = true;
    }
    if (millis()-time<intervallo)
    {
      //controllo che il motore non sia gia a sx
      destra();
    }else
    {
      disazionoDXSX();
    }
  }
  else if (valCost == 'f') //retro a sinistra
  {
    if (azionatotempo == false)
    {
      time = millis();
      azionatotempo = true;
    }
    if (millis()-time<intervallo)
    {
      //controllo che il motore non sia gia a sx
      sinistra();
    }else
    {
      disazionoDXSX();
    }
    retro();
  }
  else if (valCost == 'g') //retro
  {
    retro();
  }
  else if (valCost == 'h') // retro a destra
  {
    if (azionatotempo == false)
    {
      time = millis();
      azionatotempo = true;
    }
    if (millis()-time<intervallo)
    {
      //controllo che il motore non sia gia a sx
      destra();
    }else
    {
      disazionoDXSX();
    }
    retro();
  }else
  {
    //non faccio proprio niente
  }
 
  /*
  {
    if (velocita < 4)
    {
      velocita++;
      Serial.println(velocita);
    }
  }else if(results.value == 0x83B19366 && noresult == false)
  {
    if (velocita > 1)
    {
      velocita--;
      Serial.println(velocita);
    }
  }*/
}

void riceviValori(){
  val = mySerial.read();   // legge il valore e lo salva nella variabile 'val'
}

void avanti(){
    analogWrite(AIA, speed);
    analogWrite(AIB, 0);
}

void retro(){
    analogWrite(AIA, 0);
    analogWrite(AIB, speed);
}

void sinistra(){
    analogWrite(BIA, 0);
    analogWrite(BIB, speed);
}

void destra(){
    analogWrite(BIA, speed);
    analogWrite(BIB, 0);
}


void disazionoDXSX(){
    analogWrite(BIA, 0);
    analogWrite(BIB, 0);
}

// disaziono Avanti/Retro
void disazionoAR(){
    analogWrite(AIA, 0);
    analogWrite(AIB, 0);
}

void antiUrto(){
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);
    durata = pulseIn(ECHO_PIN,HIGH);
   
    // Converti il tempo in distanza:
    distanza = durata / 29.1 / 2 ;
   
   
    /*if (distanza <= 0){
    Serial.println("Out of range");
    }
    else {
    Serial.print(distanza);
    Serial.println("cm");
    Serial.println();
    }
    delay(1000);*/
}