Nel programma ricevente ho scritto sevo = Serial.read();, in realtà la variabile dichiarata e servo.
Quindi deve essere servo = Serial.read();
Ovviamente uno che ha imparato i rudimenti di programmazione se ne sarebbe accorto.
Purtroppo per darti un programma che certamente funzioni, dovremmo provarlo e quindi
creare il tuo circuito con i tuoi servo.
Per mia ignoranza, stavo cercando di capire cosa non funziona nel codice che mi hai scritto mentre cerco di capirne le funzioni.. la else if per quello che ho letto fa la prima funzione descritta solo se è vera e la seconda solo se la prima è falsa e la seconda è vera.. e l'operatore == significa solo se è uguale a.. non so se mi sono spiegato.. forse al posto di == serviva semplicemente = perchè assegna un valore a quella variabile? tu mi hai scritto questa parte di codice con relativi commenti:
if(Serial.available() > 0) {
servo = Serial.read();
if(servo == 'x'){// ho letto il carattere x
while(Serial.available() > 0);// Attendo che ci siano dati sulla seriale
posx = Serial.read(); // leggo l'angolo del servo x
}else if(servo == 'y'){
while(Serial.available() > 0);// Attendo che ci siano dati sulla seriale
posy = Serial.read(); // leggo l'angolo del servo y
ma cercando di capirne le funzioni o il funzionamento come dir si voglia leggo che se la seriale è pronta a leggere dati e se è vero che il carattere è uguale a "x" leggi dalla seriale quando disponibile il dato "posx", oppure se il carattere non è "x" ma "y" quando la seriale è disponibile leggi dalla seriale il dato "posy".. è corretto come ho tradotto questa parte di codice?
Si è corretto come hai capito. Serve == per vedere se è uguale. nelle condizioni non va mai messo = assegnazione.
Se ci sono if e else if, vengono valutati solo se i precedenti sono falsi, altrimenti il codice si ferma alla prima condizione vera. Se poi metti un else, l'else viene eseguito solo se tutte le condizioni sono false.
Il codice fa questo, noi sappiamo cosa trasmettiamo, un carattere e un numero.
Il primo if, se c'è qualcosa sulla seriale, e noi sappiamo che abbiamo trasmesso un carattere, leggiamo il carattere.
I sucessivi if, se il carattere è x, assegna il numero alla variabile che contiene x, se y assegna il numero alla variabile che contiene y.
Questo è necessario, perché per comandare il carroattrezzi, non sempre devi inviare sia x che y, forse a volte un solo asse, e quindi il programma deve sapere a quale asse ti riferisci.
Adesso non mi accorgo di errori nel programma, se ide di arduino ti segnala qualche errore sicuramente c'è un errore, ma altrimenti il fatto che non funzioni, potrebbe dipendere anche da altro compreso il circuito.
Hai mai visto come funziona l'assistenza telefonica, il tecnico comunica cosa controllare e fare e chi sta al telefono lo capisce, se chi sta al telefono non capisse cosa dice il tecnico sarebbe impossibile risolvere il problema.
Il tuo caso è una situazione analoga, siccome ti mancano concetti base, non sappiamo se veramente capisci dove guardare e cosa fare.
In realtà non ho neanche tutti i componenti che stai usando, quindi non potrei assolutamente realizzare il circuito.
Non devi modificare a caso, hai modificato il while che non può funzionare
while(Serial.available() > 0);// Attendo che ci siano dati sulla seriale
Significa se non ci sono caratteri continua, quindi va a leggere quando il carattere
non c'è
io avevo messo while(!Serial.available() > 0);// Attendo che ci siano dati sulla seriale
Se non ci sono caratteri attendi.
Ciao, scusa il ritardo nella risposta. Beh, non ho modificato a caso, ho pensato che siccome il "!" è un "not" non facesse la funzione quando la seriale era disponibile, tutto qua, ma evidentemente sbagliavo ancora
Posto qua il mio schema elettrico creato con Fritzing, è la prima volta che lo utilitto quindi chiedo scusa se c'è disordine nello schema ma si dovrebbero capire bene i collegamenti in quanto ho colorato le linee. I convertitori logici che utilizzo per ridurre la tensione sui pin RX degli HC-05 sono bidirezionali quindi non sono rilevanti errori di schema. Chiedo scusa anche per la dimensione dell'immagine, non so come uscirà il post
Matteo
Ovviamente i pin sui quali sono connessi i servo sono stati dichiarati come da schema nel codice.. onestamente non capisco cosa non fa funzionare il tutto ma sto continuando a cercare di capire sia come funzionano i codici che ad imparare il linguaggio
Prima di creare codice che faccia qualcosa, io proverei a vedere se si riesce a trasmettere e leggere un singolo carattere.
Usando il nome delle seriali che usi , serial o serial1
Col trasmittente uso white e invio un carattere, nel ricevente
if(Serial.available() > 0) {
sevo = Serial.read();
Ovviamente usando il nome giusto delle seriali.
Siccome un codice cosi semplice è difficile che dia problemi, se la trasmissione
non avviene, bisogna cercare il problema nel circuito e i suoi componenti, che
potrebbero essere anche difettosi.
void setup(){
Serial1.begin(38400);
Serial.begin(9600);
Serial.println("ciao");
delay(1000);
pinMode(13, OUTPUT);
}
void loop() {
if (Serial1.available()) {
char c = Serial1.read();
if (c == 'a') {
digitalWrite(12, HIGH);
Serial.print('a');
}
else if (c == 's') {
digitalWrite(12, LOW);
Serial.print('s');
}
}
}
Sul serial monitor della scheda tx leggo sulla prima riga test e sulla seconda a ed s ogni 500ms.. su quella del tx leggo ciao e basta.. e il led non si accende mai..
Ora, va bene che sono alle prime armi ma credo che questi codici siano funzionanti.. e che a questo punto sia un problema hardware..
ciao.
in effetti i 2 codici sono talmente semplici... che sembra impossibile che non funzionino...
non ho mai usato dei moduli BT, ma guardando in rete ho trovato questo:
mi pare che entrambi alimentino il modulo a 5Vcc mentre dal tuo schema mi pare alimentato a 3v3.
poi alberti parla di modalità master e slave, non so se anche questo può influire.
EDIT: leggendo meglio forse ho capito che ci sono moduli a 5V e moduli a 3v3... se il tuo è a 3v3 è corretto come lo hai alimentato
I moduli hc-05 li alimento an5v ma ho letto che il pin rx lavora a 3,3v. Di conseguenza ho usato il convertitore logico per abbassare la tensione sui pin tx e rx a 3,3v.. Diciamo che ho anche provato a collegarli direttamente sulla scheda ma niente.. Il giorno prima di quando ho iniziato a scrivere questo post avevo seguito un tutorial per comandare da una scheda un led comandata dall'altra tramite pulsante e il LED si accendeva, in ritardo, ma si accendeva.. Riproverò quello schema e quel codice per vedere j risultati, non vorrei aver rovinato, a questo punto, gli hc-05
Buonasera, confermo che la trasmissione tra gli HC-05 funziona. Ieri, mentre facevo il test nel serial monitor impostato a 38400 baud rate al posto dei caratteri che sarebbero dovuti essere "a" ed "s" leggevo qualcosa tipo punti interrogativi al contrario e "x" ogni tanto quindi mi è venuto qualche dubbio.. ho verificato tramite i comandi AT il baud rate che già avevo impostato appena acquistati gli HC-05 e risultavano corretti a 38400.. ho provato ad impostarli a 9600 entrambi modificando ovviamente i codici e il lampeggio del led funziona.. ma sembra che il ciclo sull'RX inizi con qualche secondo di ritardo.. ma funziona costantemente. Anche con il Mega RX alimentato tramite alimentatore scollegato dall'usb. Ho caricato gli ultimi codici per gestire i servo che avevo pubblicato ma niente.. all'inizio uno dei due servo connessi alla scheda, il meno potente, sembrava desse segni di vita ma poco dopo niente..
Ho notato facendo qualche prova che, fino a prima che funzionasse il lampeggio del led sulla scheda RX, con HC-05 master, se non collego i 3,3V sul pin LOW del convertitore logico il led non lampeggia mentre sulla scheda opposta, sia che lo collego oppure no la cosa non cambia. Probabilmente sarebbe funzionato anche ieri, uno dei cavetti era difettoso infatti oggi si è strappato inserendolo e togliendolo dalla breadboard per le prove di tensione e appena l'ho sostituito si è messo a funzionare il codice..
NOTA: mentre stavo postando tutto ciò si è bloccato il lampeggio.. e muovendo i cavetti si è ripristinato.. che abbia una breadboard difettosa? in alcuni punti faccio parecchia fatica ad inserire i cavetti tanto da piegarne l'estremita. Che alcuni non facciano contatto? vi è mai capitato? ora sto vagliando diversi motivi per il quale non funzionano i codici. breadboard, cavetteria.. e le mie conoscenze, ovviamente.
Matteo
Buonasera a tutti, ho provato ad aggiungere una cosa nuova ai codici descritti l'ultima volta che mi facevano lampeggiare un led sulla scheda dei motori per testare anche il funzionamento della comunicazione tra le due schede che sembra funzionare bene. Si tratta del feedback di connessione tra i moduli HC-05 che hanno a bordo un'uscita chiamata state di +5V. Ovviamente collegata correttamente come input pull up ho creato un codice sulla scheda dei motori che, alla presenza dei 5v mi accendono un led collegato alla scheda e alla mancanza si spegne. Il tutto funziona, compreso il lampeggio del led (la parte del codice che già avevo testato). Ho creato una char diversa nella scheda dei comandi per ricevere dei caratteri diversi da quelli utilizzati in precedenza, ovviamente, e due Serial1.write nella scheda dei motori per mandarli in seriale. ma quando scarico il codice sulla Mega, a parte che non funziona il codice aggiunto, si blocca anche quello precedente.. ovviamente taggo i codici per conferma ma credo che più che un mio errore possa essere un problema di buffer? che dite? ragazzi io sto cercando di impegnarmi più che posso.. ho anche provato a fare questa funzione per capire come funziona la scrittura del codice con le varie funzioni.. chiedo venia ma forse più che una char devo usare una striga dati?
void setup(){
Serial1.begin(9600);
Serial.begin(9600);
delay(1000);
Serial.println("ready...");
}
void loop() {
Serial1.write('a');
Serial.print('a');
delay(500);
Serial1.write('s');
Serial.print('s');
delay(500);
if (Serial1.available()) {
char z = Serial1.read();
if (z == 'f') {
digitalWrite(51, HIGH);
}
else if (z == 'g') {
digitalWrite(51, LOW);
}
}
}
int ledpin=13;
int buttonpin=53;
int ledstatus=1;
void setup(){
Serial1.begin(9600);
Serial.begin(9600);
Serial.println("ciao");
delay(1000);
pinMode(ledpin, OUTPUT);
pinMode(buttonpin , INPUT);
digitalWrite(ledpin, ledstatus);
}
void loop() {
if (Serial1.available()) {
char c = Serial1.read();
if (c == 'a') {
digitalWrite(12, HIGH);
}
else if (c == 's') {
digitalWrite(12, LOW);
}
}
ledstatus = digitalRead(buttonpin);
if (ledstatus == HIGH) {
digitalWrite(ledpin, HIGH);
Serial1.write('f');
}
else if (ledstatus == LOW) {
digitalWrite(ledpin, LOW);
Serial1.write('g');
}
}
int ledpin=52;
int buttonpin=53;
int ledstatus=0;
void setup(){
Serial1.begin(9600);
Serial.begin(9600);
delay(1000);
pinMode(ledpin, OUTPUT);
pinMode(buttonpin , INPUT);
digitalWrite(ledpin, ledstatus);
}
void loop() {
if (Serial1.available()) {
char c = Serial1.read();
if (c == 'a') {
digitalWrite(12, HIGH);
Serial.print('a');
}
else if (c == 's') {
digitalWrite(12, LOW);
Serial.print('s');
}
}
ledstatus = digitalRead(buttonpin);
if (Serial1.available()) {
if (ledstatus == HIGH) {
digitalWrite(ledpin, HIGH);
Serial.print('f');
Serial1.write('f');
}
else if (ledstatus == LOW) {
digitalWrite(ledpin, LOW);
Serial.print('g');
Serial1.write('g');
}
}
}
Ok, ho capito cosa faceva bloccare il tutto, e ho corretto il codice. Se trasmetto da MEGA1 "a" o "s" ricevo sul serial monitor di MEGA1 e MEGA2 "a" o "s" e MEGA 2 fa quello che deve. Se MEGA 2 trasmette "f" o "g" fa quello che deve, il suo serial monitor lo riceve ma MEGA1 non riceve nulla sul serial monitor e non fa nulla. Eppure i codici di trasmissione sono lo stessi, con una char, ma uno funziona e l'altro no. Ho capito che devo studiare ma il solo studio non mi aiuta, io per imparare devo abbinarci anche la pratica. Se volete aiutarmi benvenga e vi ringrazio, altrimenti mi cancellerò dal forum e andrò a cercare info altrove, e in entrambi i casi so che riuscirò a realizzare il mio progetto. Grazie a tutti, comunque.
Matteo
**>matt855br: ** il cross-posting è proibito dal regolamento e tu stai discutendo di questo argomento in questo thread ...
... ti prego quindi di NON aprire altri thread con le stesse cose. Grazie.
Buonsera Guglielmo, immaginavo. Ho creato quel post in quanto nessuno mi risponde. Io non penso di chiedere molto, ne di andare fuori dall'ordinario regolamento.. quindi se non riceverò aiuti questo forum mi è inutile e come scritto qua poco mi cancellerò e andrò a cercare info da altre parti. Cordiali Saluti
Matteo
Le cose che vedo "anomale" nei codici del post #37 sono:
MEGA1:
-due digitalWrite su pin 31 non inizializzato da nessuna parte (ma le Serial.print comunque devono funzionare)
-delle funzioni delay che fanno avanzare il ciclo di loop a circa un passaggio al secondo (quindi eventuali ricezioni/print possono avere fino a un secondo di ritardo)
MEGA2:
-due digitalWrite su pin 12 non inizializzato da nessuna parte (ma le Serial.print comunque devono funzionare)
-una logica per la trasmissione di 'f' o 'g' condizionata (cioè sotto if) dalla presenza di un carattere nella Serial1 (non ne capisco il senso) che comunque non dovrebbe funzionare in quanto il carattere in arrivo viene già letto con la Serial.read dell'if precedente (quello della ricezione 'a' 's').
Dal codice non è chiaro/deducibile quando (in che condizione) dovrebbe avvenire la trasmissione di 'f' o 'g'.