Bello quel componente, non pensavo gestisse anche le USB :-[
Se usi l'Arduino Uno e l'IDE 0.21 la porta in genere è /dev/ttyACM0.
Grazie a milio che mi ha suggerito la strada, ho scritto un miniprogrammino che legge i dati inviati da Arduino. Te lo allego.
Lo sketch usato sull'Arduino è il seguente:
void setup() {
}
void loop() {
Serial.begin(9600);
Serial.print("1");
Serial.end();
delay(8000);
}
ok sono riuscito a mandare dati da gambas verso arduino.
Volevo provare a far variare l'intensità di unb led tramite un terminale pwm e mandando il valore da uno slide di gambas settato come valori min e max 0 255. In fase di invio però arduino riceve invece di un numero a 2 o 3 cifre le 2 o 3 cifre separate. Se mando 255 arduini riceve 2 5 5 e mi imposta il pwm a 5.
Public Sub Slider1_Change()
Write #SerialPort1, Slider1.Value
End
c'è un modo per mandare numeri più grandi di una cifra?
Mi pare tu stia mescolando un po' i codici... :rolleyes:
Gambas:
Write #PortaSeriale, CByte(Valore)
Arduino:
Però ora che ci penso, perché leggi i dati trasmessi dal PC con AnalogRead()? Dovresti usare lo stesso protocollo seriale, ed aprire la connessione:
Serial.Begin(vel_baud);
if (Serial.available() > 0) { Valore=Serial.read(); }
VarByte = Serial.read();
VarTesto = Char(VarByte);
analogWrite(LED, VarTesto);
il codice è una oarte di arduino VarByte prende la lettura della seriale VarTesto è VarByte convertita mentre analogWrite accende un led con valore pwm passato da gambas.
cmq mi sorgono dei dubbi:
codice gambas:
write #portaseriale, "255"
codice arduino:
byte SerialIn
void setup (){
Serial.begin(9600)
}
void loop () {
if (Serial.available() > 0) {
SerialIn = Serial.read();
Serial.println(SerialIn);
}
risultato ricezione di tre righe con rispettivamente 2 5 5
se trasformo "255" in Cbyte(255) il risultato non cambia
se sullo sketch di arduino scrivo Serial.println(SerialIn, DEC) mi scrive delle volte 50 e delle volte 53
ho provato anche a cambirare a dichiarare la variabile SerialIn ma nulla.
Avete qualche suggerimento?
"Tu sbagli candeggio" ;D
Intanto una cosa. Ricordati che non puoi usare il canale seriale da 2 applicazione differenti. L'output ti perde dei numeri perché se stai usando "Mario" allora alcune cifre vengono intercettate dal mio programma ed altre dal terminale di Arduino.
Detto questo, un altro motivo del tuo problema della perdita delle cifre può essere dato dalla bassa velocità di trasmissione. Alza a 57600 baud.
Riprova con Mario 0.0.2 e questo sketch di Arduino. A me funziona benissimo, ogni volta che premo button 1 sul terminale di Arduino leggo correttamente 254.
byte SerialIn;
void setup (){
Serial.begin(57600);
}
void loop () {
if (Serial.available() > 0) {
SerialIn = Serial.read();
Serial.println(SerialIn, DEC);
}
}
tieni present eche di c io non so aasolutamente nulla!
quindi il codice dello sketch è lungi dall' essere decente, infatti non sono riuscito a "trasformare " un byte direttamente in un int e ho dovuto usare una serie di if else if, non molto pulito ma cmq funzionante:)
#include <LiquidCrystal.h>
#define l1 2
#define l2 3
#define l3 4
#define l4 5
#define l5 6
#define l6 7
#define l7 8
#define l8 9
#define l9 10
#define l10 11
#define led 13
byte in=0;
int tipo=0;
int pin=0;
int connesso=0;
//char nomi["led 1","led 2","led 3","led 4","led 5","led 6","led 7","led 8","led 9"];
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);
int i=0;
void setup() {
Serial.begin(9600);
pinMode(l1,OUTPUT);
pinMode(l2,OUTPUT);
pinMode(l3,OUTPUT);
pinMode(l4,OUTPUT);
pinMode(l5,OUTPUT);
pinMode(l6,OUTPUT);
pinMode(l7,OUTPUT);
pinMode(l8,OUTPUT);
pinMode(l9,OUTPUT);
pinMode(l10,OUTPUT);
pinMode(led,OUTPUT);
// set up the LCD's number of rows and columns:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.setCursor(0,0);
lcd.print("TEST seriale 1");
lcd.setCursor(0,1);
lcd.print("by fsurfing");
delay(1000);
}
void loop(){
if (connesso==0){
attendi();
}else{
if(Serial.available()>0){
in=Serial.read();
char a=char(in);
if(a=='i'){
tipo=1;
}else if (a=='o'){
tipo=0;
}else if(a!='#' && a!='i' && a!='o'){
if (a=='0'){
pin=2;
}else if(a=='1'){
pin=3;
}else if(a=='2'){
pin=4;
}else if(a=='3'){
pin=5;
}else if(a=='4'){
pin=6;
}else if(a=='5'){
pin=7;
}else if(a=='6'){
pin=8;
}else if(a=='7'){
pin=9;
}else if(a=='8'){
pin=10;
}else if(a=='9'){
pin=11;
}
cambia(pin,tipo);
}
}
}
}
void cambia(int pin,int tipo){
digitalWrite(pin,tipo);
lcd.clear();
if (tipo==1){
lcd.print("Acceso led ");
}
if (tipo==0){
lcd.print("Spento led ");
}
lcd.setCursor(0,1);
int p=pin-1;
lcd.print(p);
p=tipo*1000+pin;
Serial.print(p);
Serial.print("\n");
}
void attendi(){
if(Serial.available()>0){
in=Serial.read();
char a=char(in);
if (a=='#'){
Serial.print("ok");
connesso=1;
lcd.clear();
lcd.print("Connesso");
}
}
delay(100);
}
il codice gambas invece non è nullaltro che il codice dell' esempio serial port, modificato in modo che ogni pulsente alla pressione invii sulla seriale il comando di accensione e spegnimento dei vari pin
Public Sub Button8_Click()
If l4 Then
Print #Sport, "o3"; Chr$(13); Chr$(10); 'comando accensione
l4 = False
Else
Print #Sport, "i3"; Chr$(13); Chr$(10);'comando spegnimento
l4 = True
Endif
End
ok!
ho copiato il codice dello sketch e passato ad arduino
ho copiato il codice per gambas e l ho incollato nell' evento click di un button nel codice serial port degli esempi
volendo accendere il led 8 ho aggiunto : Dim l8 As Boolean e modificato tra gli apici
Dim l8 As Boolean
If l8 Then
Print #Sport, "o8"; Chr$(13); Chr$(10); 'comando accensione
l8 = False
Else
Print #Sport, "i8"; Chr$(13); Chr$(10); 'comando spegnimento
l8 = True
Endif
ma se clicco non accendo alcun led..