74164 arduino

ciao a tutti. avrei bisogno di una mano a svolgere una parte di un progetto. uso arduino abbinato alla motor shield v.2 della adafruit per un robot . avendo poche uscite ho bisogno di aumentare le uscite per mostrare tramite segnalazioni visive e sonore i movimenti del robot(destra, indietro ecc...). il mio problem è che non voglio far scorrere il tutto. vorrei in uscita una sequenza come questa(10010000) dove il primo led indica l'accensione del robot e il 4 la sua funzione avanti. ma mi scorrono i dati e tutte le luci vanno assieme. io uso questo codice: shiftOut(10, 11, MSBFIRST, f[0]); dove f fa il richiamo ad un array dove ho già memorizzato le mie combinazioni byte f[]={0b00000000, 0b10000000, 0b11000000, 0b10100000}; ne ho scritte alcune ma ce ne sono molte. mi potreste aiutare?????? P.S. non posso usare più uscite di così quindi ho due cavi di data e clock mentre il clear e B sono a Vcc

Sei stato già invitato a farlo, ma ancora non lo hai fatto, per cui ... ... ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione, possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

ma dopo posso ricevere risposte?

mattiadema97: ma dopo posso ricevere risposte?

Volentieri, se dai più info. Almeno io, non ho capito molto di quello che devi fare. Inoltre non dici quale hardware hai e come sono collegate le cose.

Il progetto consiste in un chassis 4 WD robot platform con solo 2 ruote usate per girare con più comodità. 4 sensori sharp laterali per evitare pareti e ostacoli e un sensore frontale ad ultrasuoni per la distanza. La motor shield è collegata quindi solo a 2 motori e usa di suo 4 uscite digitali per scambiare informazioni con arduino: 13 e 2. a queste uscite ho collegato echo e trig del sensore e alle entrate analogiche ho collegato invece tutti gli sharp e un sensore livello liquido inserito dentro un tank. un elettrovalvola comanda il flusso di liquido che viene sparso davanti alla spazzola che è posta in testa a tutto. il componente mi serve per mostrare quale modalità ho attiva( analogica o automatica) con dei led e quale uscita sta funzionando(elettrovalvola, spazzola ecc..) questi led però, secondo il codice che avevo scritto prima dovrebbero funzionare nel'ordine che decido io e stare fissi fino a mio comando ma scorrono e si accendono tutti.

questi led però, secondo il codice che avevo scritto prima dovrebbero funzionare nel’ordine che decido io e stare fissi fino a mio comando ma scorrono e si accendono tutti.

ma senza vedere lo sketch, non possiamo dirti perchè

ho un programma di 665 , non me lo fa inserire tutto, metto solo la modalità analogica (scusate in anticipo se non ci sono tutte le graffe chiuse ma ho tagliato senza guardarci troppo). ho messo solo alcune parti dell’analogico

#include <Servo.h>
#include <IRremote.h>
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#define trigPin 2 // sensore ultrasuoni
#define echoPin 13
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *M1 =AFMS.getMotor(4);
Adafruit_DCMotor *M2 =AFMS.getMotor(3);
Adafruit_DCMotor *Spazzola =AFMS.getMotor(2);
Servo myservo; // create servo object to control a servo
int ir_pin = A5; // pin ricevimento IR
IRrecv ir_rec(ir_pin); // funzione lettura
decode_results results;
boolean dist1 ; // davanti a sinistra
boolean dist2 ; // davanti a destra
boolean dist3 ; // lato sinistro
boolean dist4 ; // lato destro
int i;
int s;
int c;
int z;
int lettura1;
int lettura2;
int time = 100;
int pos =0;
long duration, distance;
byte f={B00000000, B10000000, B11000000, B10100000,
B10010000, B11000001, B11000100, B11000010,
B11001000, B10010111, B10011000, B10010001};

void setup(){
s =2;
Serial.begin(9600);
Serial.println(“VOID SETUP”);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.println(“PROGETTO: The cleaner. Robot per pulizia di ambienti igienico sanitari”);
AFMS.begin();
M1->setSpeed(150);
M1->run(FORWARD);
M1->run(RELEASE);
M2->setSpeed(150);
M2->run(FORWARD);
M2->run(RELEASE);
Spazzola->setSpeed(150);
Spazzola->run(FORWARD);
Spazzola->run(RELEASE);
ir_rec.enableIRIn(); // Comincia a ricevere
myservo.attach(9); // attaches the servo on pin 9 to the servo object
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}

void loop()
{
shiftOut(10, 11, MSBFIRST, f[0]);
Serial.print(“Risultato generale =”);
Serial.println(s);
/
dist1 = digitalRead(A0);
dist2 = digitalRead(A1);
dist3 = digitalRead(A2);
dist4 = digitalRead(A3);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
if (ir_rec.decode(&results))
{

Serial.println(results.value, HEX);
ir_rec.resume();

}
if ((results.value == 0xFFB04F) || s ==1)
{

s = 1;
Serial.print(“ON =”);
Serial.println(s);
shiftOut(10, 11, MSBFIRST, f[1]);

if ((results.value == 0xFF02FD) && s ==1 || z ==1)
{
delay(100);
z = 1;
Serial.print("ANALOGICO = ");
Serial.println(s);
Serial.println(“Tasto = A”);
shiftOut(10, 11, MSBFIRST, f[2]);

if ( results.value == 0xFFF807 && s == 1 && z == 1)
{

shiftOut(10, 11, MSBFIRST, f[0]);
s = 0;
c = 100;
Serial.print("Rilevato pulsante OFF = ");
Serial.println(results.value);
Serial.print("s cambia stato ! s = ");
Serial.println(s);
Serial.print("Tasto OFF = ");
Serial.println(c);
M1->run(RELEASE);
M2->run(RELEASE);
delay(50);
}

else if(results.value == 0xFF9867 || c == 1 && s == 1 && z == 1)
{
// tasto 1 sul telecomando
// AVANTI!!!
shiftOut(10, 11, MSBFIRST, f[1]);
delay(100);
c = 1;
Serial.print(“AVANTI =”);
Serial.println(s);
Serial.print("Tasto = ");
Serial.println(c);
dist1 = digitalRead(A0);
dist2 = digitalRead(A1);
dist3 = digitalRead(A2);
dist4 = digitalRead(A3);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
if (distance <= 20)
{
M1->run(RELEASE);
M2->run(RELEASE);
}
else
{
if(dist1 == true && dist2 == true)
{
M1->run(FORWARD);
Serial.println(“M1 sta andando avanti”);
M2->run(FORWARD);
Serial.println(“M2 sta andando avanti”);
M1->setSpeed(125);
M2->setSpeed(125);
}
else if(dist1 == false && dist2 == true)
{
M1->run(BACKWARD);
M2->run(BACKWARD);
M1->setSpeed(125);
M2->setSpeed(250);
delay(250);
M1->run(FORWARD);
M2->run(FORWARD);
M1->setSpeed(250);
M2->setSpeed(125);
delay(250);
}
else if(dist2 == false && dist1 == true)
{
M1->run(BACKWARD);
M2->run(BACKWARD);
M1->setSpeed(250);
M2->setSpeed(125);
delay(250);
M1->run(FORWARD);
M2->run(FORWARD);
M1->setSpeed(125);
M2->setSpeed(250);
delay(250);
}
}
}
// fine AVANTI

else if(results.value == 0xFF48B7 || c == 6 && s == 1 && z == 1)
{
// tasto 6 sul telecomando
// SPAZZOLA!!!
shiftOut(10, 11, MSBFIRST, f[5]);
delay(100);
c = 6;
Serial.print("SPAZZOLA = ");
Serial.println(s);
Serial.print("Tasto = ");
Serial.println(c);
Spazzola->run(FORWARD);
for (i=0; i<255; i++) {
Spazzola->setSpeed(i);
delay(15);
}
for (i=255; i!=0; i–) {
Spazzola->setSpeed(i);
delay(15);
}
}
// fine spazzola

}
else if ( results.value == 0xFFF807 || s ==0 )
{
shiftOut(10, 11, MSBFIRST, f[0]);
Serial.print("OFF = ");
Serial.println(s);
// tasto MUTO sul telecomando
M1->run(RELEASE);
M2->run(RELEASE);
delay(50);
}
}

Le “risposte le ricevi”, ma vedo che però il regolamento NON lo hai letto … :smiling_imp:

… in base al punto 7, devi editare (in basso a destra del post, bottone More → Modify) il tuo post e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Guglielmo

void loop()
{
  shiftOut(10, 11, MSBFIRST, f[0]);

se ad ogni cliclo spegni i led, per forza ti viene fuori un albero di natale