Sida 1 av 5

konsolmeny till arduino

Postat: 16 januari 2012, 11:32:18
av lillmange
Hej,

Jag håller på med ett mindre arduino projekt, en fläktkontroller.

Nyligen kom jag på att jag vill ha en konsollmeny/CLI för att styra min arduino med för att slippa ha display och massor med knappar/rattar.

Iden ser ut såhär:
Jag har arduino kortet i datorn, ansluten via usb för ström och seriell data.
Kortet har även anslutning till en modul som mäter temperaturen i datorn och pwm styr fläktarna.

För att ändra värdena i fläktkontrollern och för att kunna övervaka vill jag använda mig av tex putty.
Då via någon typ av menysystem eller CLI liknande.

Har någon sett exempelkod som kan passa till detta eller kan hjälpa mig med hur man ska göra?

Tack!
/Magnus G

Re: konsolmeny till arduino

Postat: 16 januari 2012, 11:41:22
av sodjan
Tänkte du köra seriellt via PyTTY?
Har du något serieinterface i "datorn"?
Och vad är egenteligen det du kallar "datorn" för något?

Men anta att det är en Windows maskin. ENklast kanske är
att antingen köra med befintligt serieinterface eller att komplettera
med en USB/RS232 adapter. Eller kanske att den befintliga USB kopplingen
har någon emulerad serie-lina, var det inte så i en annan tråd? I så fall
bör väl PyTTY kunna köra öven den förbindelsen.

Re: konsolmeny till arduino

Postat: 16 januari 2012, 11:46:47
av lillmange
Hej,

Precis en windowsdator som snackar över USBkabeln till den i arduino inbyggda rs232 "omvandlaren" och sen vidare till arduino.

Jag kanske beskrev problemet lite dåligt det är alltså Kod att stoppa i arduino som jag behöver hjälp med, allt annat är jag nästintill klar med hur jag ska göra.

Tack för svaret!

/Magnus G

Re: konsolmeny till arduino

Postat: 16 januari 2012, 11:56:23
av sodjan
Jaha, med Arduinokoden skriver du väl själv !?
För det första måste du få Arduinom att lyssna på serielinjen över huvudtaget.
Sedan får du definiera de kommandon som behövs.
De kan vara antingen vara kompakta för att göra det hela enklare
i Arduino änden eller mer i klartext för att göra det enklare i PC änden.
I det första fallet kanske det inte räcker med PyTTY utan det behövs ett
GUI som översätter till de kompakta koderna, i det andra fallet kan du köra
PyTTY direkt men koden i Arduino blir lite mer komplex. Välj själv.

Re: konsolmeny till arduino

Postat: 16 januari 2012, 12:48:57
av lillmange
Ja precis, koden tänkte jag skriva själv (helt eller delvis) men jag är osäker på hur man ska få till det och det var därför jag ställde frågan...

/Magnus G

Re: konsolmeny till arduino

Postat: 16 januari 2012, 12:53:31
av sodjan
OK. Och du har fått svar nu?
Om det är något oklart så får du fråga...

Re: konsolmeny till arduino

Postat: 16 januari 2012, 12:58:10
av lillmange
Tack för att du tar dig tid att svara men tyvärr har jag inte kommit närmare en lösning.
Det jag efterfrågar är förslag på kod eller liknande projekt där jag kan få tips.
Även tips på vilka kommandon man kan använda och hur för att få till ett CLI eller menysystem mottages tacksamt.

/Magnus G

Re: konsolmeny till arduino

Postat: 16 januari 2012, 13:00:15
av jesse
lillmange skrev:Jag har arduino kortet i datorn, ansluten via usb för ström och seriell data.
Kortet har även anslutning till en modul som mäter temperaturen i datorn och pwm styr fläktarna.

För att ändra värdena i fläktkontrollern och för att kunna övervaka vill jag använda mig av tex putty.
Då via någon typ av menysystem eller CLI liknande.
Det du vill är alltså att samtidigt som din Arduino ska styra och övervaka fläkt och temperatur , så ska den vara redo att ta emot kommandon från datorn via USB / seriellt ?

Jag har inte Arduino, men är det så att den har nån inbyggd FT232 eller liknande krets så att du använder UART i din AVR för seriekommunikationen?

Har du använt seriekommunikationen förut på din Arduion så du vet hur man gör / skriver kod?


Problemet du har att lösa är att din Arduino måste kunna lyssna på UART samtidigt som den utför andra uppgifter. Detta kan du göra i huvudloopen på olika vis.

Jag hade själv valt att skapa en interruptstyrd funktion som läser in data från UART och stoppar dessa i en buffert. När tecknet "ENTER" (0x0D) kommer in så är det ett tecken på att hela kommandot är färdigskrivet och din Arduion då ska tolka och utföra uppgiften. Då kan inläsarfunktionen sätta en flagga som signalerar att "textrad inkommit".

I huvudloopen kollar du då bara flaggan:

Kod: Markera allt

while(1) { // main loop
    if (line_in == 1) check_inline();
    // gör övrigt här
}

void check_inline( void ) {
    // denna funktion läser ur inbuffer 
    // och tolkar kommandon
    data = read_inbuf_character(); // läs tecken i buffer
    switch (data) {
        case 'z':
            stop();
            break;
        case 's':
            set_speed();
            break;
        case 't':
            read_temp();
            break;
        default:
            send_error_message();
    }
}
Om du håller dig till kommandon som bara har en bokstav (följt av eventuell data) så kan det vara enkelt att använda en switch-sats i "check_inline"-funktionen, som i exemplet ovan.

Det krävs ju lite pysslande för att få igång den interruptdrivna inläsarfunktionen....
Ett tips angående inbuffertens längd: om du aldrig skriver kommandon som innehåller fler än 10 tecken så räcker det med en så kort buffert. I så fall kan du avsluta om den är full (som om du hade tryckt ENTER).

EDIT: Jag har ett färdigt kodexempel för en ATMega48, men det är delvis kanske inte så snyggt, delvis behöver du säkert modda om det en del för att passa just din Arduio, och dels är den dåligt kommenterad, men principen är densamma som ovan. Om du vill att jag postar den så får du dessutom en massa hjälpfunktioner på köpet: omvandla inlästa data från acsii-heltal till int, omvandla int till ascii heltal, decimaltal med visst antal decimaler med mera...

Re: konsolmeny till arduino

Postat: 16 januari 2012, 13:10:01
av lillmange
Man Tackar!

Ska kolla lite mer på koden ikväll.

/Magnus

Re: konsolmeny till arduino

Postat: 16 januari 2012, 13:15:21
av sodjan
> Jag har inte Arduino, men är det så att den har nån inbyggd FT232 eller liknande krets så att du använder UART i din AVR för seriekommunikationen?

Har inte (det såg ut så i en annan tråd) Arduino en emulerad COM-port via den
befintliga USB anslutningen ? Det var en tråd där TS bytte mellan den och en
"riktig" COM-port (COM3 resp COM1 om jag minns rätt) man hade lite problem
med nivåanpassningen. Men förrutom det så fungerade båda portarna
på liknande sätt.

Man borde kunna köra från Windowsmiljön mot den emulerade COM porten
och ha lämplig kod på Arduino sidan som hanterar motsvarande port där.

Re: konsolmeny till arduino

Postat: 16 januari 2012, 13:38:10
av Bosen
Ta och kolla på: http://arduino.cc/playground/Code/CmdMessenger
och denna enklare versionen.
För min del så räcker den enklare versionen bra och den är väldigt lätt att förstå när man kör exempel filen.

Re: konsolmeny till arduino

Postat: 16 januari 2012, 13:39:58
av jesse
(Bosen hann i mellan med ett inlägg - kanske hans länk är enklare - här kommer i alla fall min kod)

Jag kan ju skicka koden i alla fall så kan du kolla.
Jag skickar med hela programmet (det läser in temperaturer och styr en ugn)
Bifogad som Zip-fil.
lodugn.zip
Det du ska titta på är:

uart.h
uart.c

-- dessa filer innehåller funktionerna för att läsa och skriva till UART.

lodugn.h
lodugn.c

-- dessa filer är huvudprogrammet. i lodugn.c ska du särskilt kolla stycket där det står // **** kolla UART input ****. Där har du switch-satsen som läser av kommandona. I det här fallet bara t, z, p och a. Kolla särskilt 't' - där jag läser in ett heltal med satsen tempset = uartReadDecimal();

i filen uart.c så är vissa funktioner viktigare än andra. Nedan kommer de viktigaste:

Först för att kunna läsa in tecken från UART:

void uart0_init(void) initierar UART. Här kanske du får modifiera beroende på din hårdvara.

ISR(USART_RX_vect ) - den viktigaste. Denna styrs av interrupt och anropas varje gång ett tecken kommit in via UART och lägger in tecknet i strängen uartInputBuffer[]

void uartFlush( void )- tömmer indatabuffert. Detta måste du göra när ett kommando är avläst för att man ska kunna skriva in ett nytt.

char uartRead( void ){ // läs tecken. 0 = slut på raden / ingen data. --- läser ett tecken ur buffert.

char uartCheckNext( void ) - kollar nästa tecken i bufferten utan att ta bort det.

int16_t uartReadDecimal(void) - läser in ett heltal mellan -32768 och +32768 från buffert




Funktioner för att skriva till UART:

void uartChar( char data ) - skickar ut ett tecken till UART.

void print_EEMEM(const char * string)

void printDecimalPunkt(int16_t nummer,uint8_t storlek,uint8_t decimaler) - skriver ut ett decimaltal. Vad den gör egentligen är att den skriver ut ett heltal och sätter en decimalpunkt på valfri plats mellan siffrorna.

exempel: void printDecimalPunkt(31415,6,4) skriver ut 3.1415 med minst 6 tecken.

Re: konsolmeny till arduino

Postat: 16 januari 2012, 13:47:36
av Bosen
just detta jesse är jag nog ganska säker på att TS har koll på, då detta är färdiga rutiner i Arduino. (länk till arduino rutiner)
Det TS är ute efter vad jag tror, är att läsa av olika kommandon på ett enkelt sätt. Att lägga dom i en buffer och jämföra strängar ungefär.... det är här man kör fast...

Re: konsolmeny till arduino

Postat: 16 januari 2012, 14:10:54
av sodjan
Kör fast? Har han ens startat?

Det ser ut som att kodexemplet "Dimmer" har en del av det
efterfrågade : http://arduino.cc/en/Tutorial/Dimmer.
This example shows how to send data from a personal computer to an Arduino board to control
the brightness of an LED. The data is sent in individual bytes, each of which ranges in value from
0 to 255. Arduino reads these bytes and uses them to set the brightness of the LED.

You can send bytes to the Arduino from any software that can access the computer serial port.
Jag tror att det bästa är om TS är lite med specific så att det
framgår lite bättre vad som är frågan/problemet.

Re: konsolmeny till arduino

Postat: 16 januari 2012, 14:55:09
av lillmange
Bosen skrev:Ta och kolla på: http://arduino.cc/playground/Code/CmdMessenger
och denna enklare versionen.
För min del så räcker den enklare versionen bra och den är väldigt lätt att förstå när man kör exempel filen.

Det här såg ut som något jag verkligen kan ha nytta av.
Dessutom så är det mycket info om hur man ska använda kommandona.

Tack alla för er hjälp!
Som ni säkert har fattat nu är jag inte så haj på programmering och helt ny på arduini (har pillat lite med picbasic för 5 år sedan)

ännu en liten fråga
Hur får man arduino att rensa skärmen i putty?

/Magnus