Node Red till Arduino via usb/seriellt

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
ludde_018
Inlägg: 50
Blev medlem: 27 juni 2011, 20:41:09

Node Red till Arduino via usb/seriellt

Inlägg av ludde_018 »

Hej!

Inte har jag en sån tur att någon här inne sitter med en kod för att ta emot data från Node Red till Arduino via serieporten/USB? Gärna uppsorterat så jag kan använda rätt temperaturer på rätt ställe i programmet.

Det mesta jag hittar är att man endast skickar ett tecken i taget låter arduinon göra uppgifter efter det. Tyvärr funkar inte det i mitt fall, jag behöver kunna sända 4 temperaturer, samt sköta 2 pwm signaler från Node Red.

Hade fler värden som skulle åt andra hållet, men det har jag lyckats lösa med hjälp av blocken Serie in -> Json -> Funktion -> . Dock verkar det knepigare att ta emot och sorter rätt i arduinon.


Stort tack om någon har något användbart att dela med sig av eller knuffa mig ordentligt i rätt riktning då jag har tummen mitt i handen gällande sånt här :)
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Node Red till Arduino via usb/seriellt

Inlägg av Icecap »

Om ditt problem är att ta emot text och sedan använda de data som de innehåller är det i grunden otroligt enkelt. Jag har gjort detta MYCKET i mina projekt och i grunden är det frågan om att ta emot de enskilde tecken o spara dom i en buffer fram till att man når ett stopp.

Hur stoppet är utformat beror på vad man har vald, jag använder STX (0x02) som start-av-text och ETX (0x03) som end-of-text.

Så när det kommer en STX nollställer jag buffern och när ETX kommer utför jag parsningen av den mottagna sträng.

Alla tecken som kommer mellan STX och ETX läggs i buffern vid att hitta första 0x00 i buffern, mata in tecknet där och sedan mata in en 0x00 i platsen efter.

När detta är klart och ETX kommer är det en sträng som ska delas upp och avkodas.
ludde_018
Inlägg: 50
Blev medlem: 27 juni 2011, 20:41:09

Re: Node Red till Arduino via usb/seriellt

Inlägg av ludde_018 »

Helt rätt, och tack för svaret ditt :)

Det är på arduino sidan som jag har minst kunskap och jag har egentligen aldrig lyckats bra med med det seriella. Så därav till det här projektet där jag önskar ha lite stabilitet tänkte jag höra mig för.

Det är inte så att du har en bit färdig kod som du skulle kunna kopiera in och dela med dig av?


// Jocke
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Node Red till Arduino via usb/seriellt

Inlägg av Micke_s »

Jag har kopplat mina Arduino prylar via python->MQTT->Node red..

Då kan du hantera formatering mm i python och skicka formated data över MQTT.

I princip så kan det lilla programmet vara skrivet i c#/c eller något annat språk som har en MQTT klient.
ESP8266 kan t.ex. koppla upp sig direkt mot MQTT.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Node Red till Arduino via usb/seriellt

Inlägg av Icecap »

Nja... jag har allergi mot Arduino - men jag kan klistra in lite från min Renesas RX210:

void __attribute__ ((interrupt)) RS232_A_Rx_ISR(void)
{
// Recieve interrupt (if enabled)
_UBYTE Incoming;
Incoming = SCI1.RDR; // A read empties the Rx-buffer and removes the interrupt
switch(Incoming)
{
case STX:
RS232_A.Rx.In = 0; // Empty buffer by setting string length to 0
break; // STX
case ETX:
RS232_A.Rx.Chars = RS232_A.Rx.In;
if(RS232_A.Rx.In) RS232_A.Rx.Flag = MESSAGE_TIMEOUT;
RS232_A.Rx.In = 0;
break; // ETX
default:
// Add incoming to buffer
if(RS232_A.Rx.In < sizeof(RS232_A.Rx.Buffer) - 1)
{
RS232_A.Rx.Buffer[RS232_A.Rx.In++] = Incoming;
RS232_A.Rx.Buffer[RS232_A.Rx.In] = 0;
}
break;
}
}


Denna rutin kallas av Serial-Char-Recieved-interrupten (jag körer "allting" interrupt-styrd) och RS232_A.Rx.Flag är en flagga som innehåller ett värde som rent faktisk räknas ner av en timer-interrupt. Om det finns ett meddelande i buffern (RS232_A.Rx.Flag inte noll) kör main-loop en dekodning av den sträng och placerar data där de ska vara.

Om den inte hinner med kommer meddelandet att timas ut, jag brukar ge systemet upp till 500ms att reagera - men det är jag det.

Annorstädas är de olika variabler och värden definierat och jag har vald att ha dom i blockform, bara för att jag kan. Då dessa rutiner ligger i separata filer blir de effektivt sett exkluderat från andra rutiner så att de inte kan "förorenas".

RS232_A.Rx.In är en räknare av antalet tecken i buffern, detta går snabbare än att söka efter första 0x00.

Buffern ska såklart dimensioneras efter det längste meddelande som kan komma och man bör ha med någon form av checksumkontroll eller kontroll av vettiga data när man parser de mottagna data.

Jag brukar tänka så att meddelanden som blir störda av glappkontakt i en kontakt ska förkastas och alla hela meddelanden som kommer fram ska användas. Ett halvt meddelande ska förkastas.
Skriv svar