Buongiorno amici!
Ho acquistato Arduini Uno e con un pò di delusione ho visto che posso leggere i dati degli ingressi analogici
dal monitor seriale..
cercando qua e la ho trovato varie soluzioni in C++ (ma non ci capisco un H++...)
in Visual Basic che però funziona su xp ma non ne voglio più sapere..
Ho trovato su questo forum
http://www.gambas-it.org/smf/index.php?topic=2485.msg26660;topicseen#msg26660
compersi
* leggi_ingressi-3.0.tar.gz
* lettura_ingressi_analogici.zip
che ho installato e funzionano. :D
ora vorrei un plot grafico che mi disegni ogni secondo il valore preso dal pin A1
tipo:
dato = valore preso da A1
punto (valore di x , dato)
valore di x = valore di x +1
Sembra facile e in Vb lo saprei fare ma modificando così:
Public Sub SPort_Read()
Dim s, $s As String
Dim i As Integer
Dim incr As Integer
Read #Sport, s, Lof(Sport)
s = Replace(s, "\r\n", "")
s = Replace(s, "\n", "")
s = Replace(s, "\r", "")
Print s
For i = 1 To Len(s)
$s = Mid(s, i, 1)
If $s = "#" Then
sbuf = ""
Else If $s = "!" Then
textbox1.text = sbuf
analizza(sbuf)
incr = incr + 1
Else
sbuf &= $s
Endif
Next
Catch
Timer1.Stop
Wait 0.1
connetti
Draw.Begin(DrawingArea1)
Draw.point(100 + incr, 100)
Draw.End
End
non vedo risultati.. ???
Sono certo che è semplice e col vostro aiuto funzionerà!
Ho impostato Drawingarea1 cached = true
e modificato:
Public Sub SPort_Read()
Dim s, $s As String
Dim i As Integer
' Dim incr As Integer
Dim valore As Integer
Read #Sport, s, Lof(Sport)
s = Replace(s, "\r\n", "")
s = Replace(s, "\n", "")
s = Replace(s, "\r", "")
Print s
For i = 1 To Len(s)
$s = Mid(s, i, 1)
If $s = "#" Then
sbuf = ""
Else If $s = "!" Then
textbox1.text = sbuf
analizza(sbuf)
Dial1.Value = (sbuf / 10)
valore = sbuf
Draw.Begin(DrawingArea1)
Draw.Fillcolor = 1000
Draw.point(incr, valore)
Print incr
Draw.End
incr = incr + 1
Else
sbuf &= $s
Endif
Next
Catch
Timer1.Stop
Wait 0.1
connetti
End
ora funziona!
Grazie mille a fsurfing per i files! :D
Non ho mai usato Arduino ma se si tratta di leggere in maniera seriale suppongo che per scrivere si debba aprire la porta seriale corrispondente e mandare i dati.
Nell'altro thread si apre la seriale in questa maniera:
hFile = OPEN "/dev/ttyS0" FOR READ WRITE WATCH
Così dovrebbe essere aperta sia in lettura che in scrittura.
in realta è tutto molto semplice, volendo si può utilizzare la comunicazione seriale per inviare e ricevere dati da/a arduino
per intenderci solitamente la porta di comunicazione è /dev/ttyACM0
per la comunicazione seriale l' esempio serialport di gambas3 è ottimo per iniziare e per essere modificato a nostro comodo
piccolo esempio:
int RELE =11;
int i = 0;
int inByte = 0;
int ngocce=0;
int tempo=0;
int ritardo=0;
String ricevuto="";
boolean completo= false;
void setup()
{
pinMode( RELE, OUTPUT);
Serial.begin(19200);
ricevuto.reserve(100);
}
void loop(){
// print the string when a newline arrives:
if (completo==true) {
ngocce=(ricevuto.substring(0,4).toInt());
tempo=(ricevuto.substring(5,8).toInt());
ritardo=(ricevuto.substring(9,12).toInt());
//Serial.println(ngocce);
//Serial.println(tempo);
//Serial.println(ritardo);
for (i=1 ; i< (ngocce+1); i++){
digitalWrite(RELE,1);
delay(tempo);
digitalWrite(RELE,0);
delay(ritardo);
//Serial.println(i);
}
// clear the string:
ricevuto = "";
completo = false;
//Serial.println(completo);
Serial.println("ok");
}
}
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
ricevuto += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
completo = true;
}
}
}
lo sketch riceve una strinca formata da 3 numeri di 4 cifre che indicano il numero di impulsi la durata dell' impulso e il tempo di pausa tra gli impulsi
quindi sulla seriale basterà spedire una stringa di questo tipo
000505000200
per avere 5 impulsi di 500ms con una pausa di 200 ms tra uno e l' altro
ps: non sono un esperto di programmazione simil c , quindi il codice potrebbe esserere migliorabile
non è difficile
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
ricevuto += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
completo = true;
}
}
}
questa funzione non fa altro che ricevere tutti i char che arrivano sulla seriale e metterli uno dopo l' altro nella stringa "ricevuto"
quando arriva il carattere di ritorno a capo "\n" (quando invii la stringa con gambas automaticamente viene terminata con un carattere di ritorno), la variabile completo passa a true, quindi interviene la funzione principale main loop
void loop(){
// print the string when a newline arrives:
if (completo==true) {
ngocce=(ricevuto.substring(0,4).toInt());
tempo=(ricevuto.substring(5,8).toInt());
ritardo=(ricevuto.substring(9,12).toInt());
//Serial.println(ngocce);
//Serial.println(tempo);
//Serial.println(ritardo);
for (i=1 ; i< (ngocce+1); i++){
digitalWrite(RELE,1);
delay(tempo);
digitalWrite(RELE,0);
delay(ritardo);
//Serial.println(i);
}
// clear the string:
ricevuto = "";
completo = false;
//Serial.println(completo);
Serial.println("ok");
}
}
infatti il codice del loop non viene mai eseguito se completo non è = a true (primo if)
essendo la stringa ricevuto completa l' if viene eseguito
per cui io ho estratto dalla stringa ricevuta le 4 sotto stringhe di 4 caratteri che indicano i tempi , e nella stessa riga di codice le converto in integer
a questo punto nelle tre variabili gogge , tempo e ritardo ho i 3 valori in millisecondi che mi servono a far lampeggiare il pin 11
questo viene fatto dal ciclo for che in pratica loopa per un tot di volte a seconda del valore di "gocce"
per ogni ciclo viene posto a 1 il pin , per il tempo indicato da "tempo" (1° delay)
poi il pin vine posto a 0
poi il secondo delay aspetta per il tempo impostato da ritardo e quindi il ciclo si ripete
finiti tutti i cicli la variabile ricevuto viene svuotata
e completo posto a false, così il programma è pronto a ricevere nuove stringhe.
questo è solo un esempio che è stato realizzato in questo modo perchè a me serviva così , ma come in tutti i linguaggi ci sono svariati altri modi per ottenere il risultato voluto
cmq Serial.read() legge la seriale
Serial.println invia sulla seriale qualsiasi tipo di dato
no riesco ad allegare e allora copiaeincolla
...
// il seguente codice deriva da quello scritto da fsurfing
int i = 0;
int inByte = 0;
int passi=0;
int tempo_h=0;
int tempo_l=0;
int direzione=0;
String ricevuto="";
boolean completo= false;
void setup()
{
// pin2 per gli step pin3 per direzione
pinMode( 2, OUTPUT);
pinMode( 3, OUTPUT);
Serial.begin(19200);
ricevuto.reserve(100);
}
void loop(){
if (completo==true) {
// estraiamo i dati dalla stringa che abbiamo passato
passi=(ricevuto.substring(0,4).toInt());
tempo_h=(ricevuto.substring(5,8).toInt());
tempo_l=(ricevuto.substring(9,12).toInt());
direzione=(ricevuto.substring(12).toInt());
// diamo un senso di rorazione
digitalWrite(3,direzione);
// azzera
digitalWrite(2,0);
for (i=1 ; i< (passi+1); i++){
// step! la durata dipende dall hardware
digitalWrite(2,1);
delayMicroseconds(tempo_h);
// quanto tempo voglio par passare prima del prossimo step?
digitalWrite(2,0);
delayMicroseconds(tempo_l);
//Serial.println(i);
}
// clear the string:
ricevuto = "";
completo = false;
Serial.println("ok");
}
}
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
ricevuto += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
completo = true;
}
}
}