Hej!
Jag håller på programmera UNO via Simulink och det går mycket bra. Jag har lärt mig allt själv utan att fråga, men nu har jag en liten udda fråga.
I Arduinos språk, Processing, så tänder man t.ex en LED-lampa via digitalWrite(pin, HIGH). Där high kan vara ett värde mellan 0 och 0.9999, som LOW, men 1 och uppåt som HIGH, dvs ett flytttal eller double som det idag kallas. Float kallas det väll också?
Hur som helst så fungerar det även att skriva digitalWrite(pin, ture) eller digitalWrite(pin, false)
Men i Simulink så går det INTE att använda ett booleanskt värde för ON eller OFF för att tända LED-lampan på UNO:n. Detta booleanska värde är alltid ON.
Tänk er att ni har en Pulse Generator i Simulink som ger ett double värde (Pulse Generator kan endast ge värdet double) och detta värde gå in i ett konverteringsblock och ut kommer 1 och 0 i en tidsfunktion.
Då går detta booleanska värde in i LED-lampa-blocket och då tänds lampan, men inte släcks. Bara lyser i fast sken.
Om jag istället gör så LED-lampa-blocket tar in double som datatyp och tar bort konverteringsblocket och kör bara Pulse Generator -----> LED-lampa-blocket. Då fungerar det.
Det fungerar också om jag kör denna:
Pulse Generator(double från 0 till 1.3) -----> konverteringsblock(boolean från 0 till 1) ---->konverteringsblock(single från 0 till 1) ----> LED-lampa-blocket(single).
Även datatypen Single, som double, kan användas också.
Varför måste jag konvertera om decimaltal->booleanskt värde->heltal för att det ska fungera att tända LED-lampan med 1 eller 0? Varför borde inte det booleanska värdet passa utmärkt? Det är antingen en 1:a eller en 0:a, precis som ett heltal.
Annars fungerar det lika bra att köra direkt double som "true" eller "false", men det ser inte snyggt ut. Det kan bli förvirrande att tolka 1.2345 som true, bara för att det är 1+ och 0.9999 som false bara för att det är mindre än 1.
Om någon undrar hur jag lyckades att skapa egna block i Simulink för att kunna använda dem med Arduino UNO så är det bara fråga. Denna metod underlättar mycket. Bara klicka och dra, samt deklarera.
Det kan vara så att jag behöver uppdatera MATLAB till 2014. Jag kör ju bara 2013 och 2012 kom stödet för Arduino.
Simulink: Varför går det endast skicka double, men inte bool
- SeniorLemuren
- Inlägg: 8426
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Simulink: Varför går det endast skicka double, men inte
Jag vet inget om Simulink eller Arduino, men om du använder en pulsgenerator i Simulink som ger analoga pulser så använder du fel pulsgenerator (eller en felkonfigurerad pulsgenerator). digitalWrite(pin, HIGH) säger ju att argumentet HIGH skall vara binärt. alltså antingen 0 eller 1 och ingenting annat. Du skall alltså använda en pulsgenerator som ge ut digitala pulser. INTEGER ist.f FLOAT som output.
Re: Simulink: Varför går det endast skicka double, men inte
Det finns ingen Pulse generator som ger specifikt digitala signaler, tyvärr.
Re: Simulink: Varför går det endast skicka double, men inte
Men jag tror jag ska nog ta och uppdatera mig till 2014 så återkommer jag med svar. Annars får jag acceptera det som det är.
-
- Inlägg: 1409
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Simulink: Varför går det endast skicka double, men inte
Arduinos dokumentation är ganska dålig, men om man pusslar lite så hittar man
http://arduino.cc/en/Reference/DigitalWrite
http://arduino.cc/en/Reference/BooleanVariables
http://arduino.cc/en/Reference/Constants
Där ser man att giltiga värden för digitalWrite() är enbart HIGH & LOW. Och att HIGH & LOW är av typ boolean.
Om simulink tillåter andra värden, eller inte tillåter boolean, så får du nog fråga MathWorks om du vill ha ett exakt svar varför. Vi här kan ju bara gissa.
http://arduino.cc/en/Reference/DigitalWrite
http://arduino.cc/en/Reference/BooleanVariables
http://arduino.cc/en/Reference/Constants
Där ser man att giltiga värden för digitalWrite() är enbart HIGH & LOW. Och att HIGH & LOW är av typ boolean.
Om simulink tillåter andra värden, eller inte tillåter boolean, så får du nog fråga MathWorks om du vill ha ett exakt svar varför. Vi här kan ju bara gissa.
Re: Simulink: Varför går det endast skicka double, men inte
Tackar! Jag körde med ett gammalt ArduinoIO-paket från MathWorks. Nu har jag det nya 
Jag tror det ska fungera nu.

Jag tror det ska fungera nu.