mmiscool
Mar 26, 2015
Using an Arduino as a slave board
Arduino serial interfacing and basic function library (This article is a work in progress )By Mike Molianri
// Buffer to store incoming commands from serial port
String inData;
void setup() {
Serial.begin(9600);
Serial.println("Serial conection started, waiting for instructions...");
}
void loop() {
while (Serial.available() > 0)
{
char recieved = Serial.read();
inData += recieved;
// Process message when new line character is recieved
if (recieved == '\n')
{
String Param0 = getValue(inData, ' ', 0);
String Param1 = getValue(inData, ' ', 1);
String Param2 = getValue(inData, ' ', 2);
String Param3 = getValue(inData, ' ', 3);
String Param4 = getValue(inData, ' ', 4);
String Param5 = getValue(inData, ' ', 5);
inData = "";
int valParam0 = Param0.toInt();
int valParam1 = Param1.toInt();
int valParam2 = Param2.toInt();
int valParam3 = Param3.toInt();
int valParam4 = Param4.toInt();
int valParam5 = Param5.toInt();
//Serial.print(valParam0);
//Serial.print(valParam1);
//Serial.print(valParam2);
//Serial.print(valParam3);
//Serial.print(valParam4);
//Serial.print(valParam5);
if ( Param0 == "get")
{
pinMode(valParam1, INPUT);
Serial.println(digitalRead(valParam1));
}
if ( Param0 == "set")
{
pinMode(valParam1, OUTPUT);
digitalWrite(valParam1, valParam2);
Serial.println("1");
}
if ( Param0 == "pwm.out")
{
analogWrite(valParam1, valParam2);
Serial.println("1");
}
if ( Param0 == "pwm.in")
{
Serial.println(analogRead(valParam1));
}
}
}
}
String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = {
0, -1 };
int maxIndex = data.length()-1;
for(int i=0; i<=maxIndex && found<=index; i++){
if(data.charAt(i)==separator || i==maxIndex){
found++;
strIndex[0] = strIndex[1]+1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
} </span>
|| <span style="font-size: 1.1em;">dim pins$(100)
'Populate pin list
for x = 0 to 13
pins$(x) = str$(x)
next x
nomainwin
WindowWidth = 360
WindowHeight = 445
UpperLeftX=int((DisplayWidth-WindowWidth)/2)
UpperLeftY=int((DisplayHeight-WindowHeight)/2)
listbox #main.PinSelector, pins$(, [listbox1DoubleClick], 10, 82, 130, 320
statictext #main.statictext2, "Pin Selector", 10, 62, 130, 20
textbox #main.ValToSend, 165, 32, 170, 25
statictext #main.statictext4, "Value To Send", 165, 12, 170, 20
statictext #main.statictext5, "Return Value", 165, 62, 175, 20
textbox #main.ReturnValue, 165, 82, 170, 25
button #main.button7,"Set Pin High/Low Status",[Set.Pin], UL, 165, 117, 170, 25
button #main.button8,"Get Pin High/Low Status",[Get.Pin], UL, 165, 152, 170, 25
button #main.button9,"PWM Output (Servos)",[PWM.Out], UL, 165, 187, 170, 25
button #main.button10,"PWM Input",[PWM.In], UL, 165, 222, 170, 25
statictext #main.statictext11, "Com Port Number", 10, 12, 145, 20
textbox #main.ComPortNo, 10, 32, 130, 25
open "LB Ultra Simple Arduino Demo" for dialog as #main
print #main, "trapclose [quit.main]"
wait
[Set.Pin]
gosub [Get.The.Selctions.And.Textboxes.From.Main.Win]
return.value = AD.Set(Com.port.Selection, Pin.Selection, Val.To.Send)
print #main.ReturnValue, return.value
wait
[Get.Pin]
gosub [Get.The.Selctions.And.Textboxes.From.Main.Win]
return.value = AD.Get(Com.port.Selection, Pin.Selection)
print #main.ReturnValue, return.value
wait
[PWM.Out]
gosub [Get.The.Selctions.And.Textboxes.From.Main.Win]
return.value = AD.PWM.Out(Com.port.Selection, Pin.Selection, Val.To.Send)
print #main.ReturnValue, return.value
wait
[PWM.In]
gosub [Get.The.Selctions.And.Textboxes.From.Main.Win]
return.value = AD.PWM.In(Com.port.Selection, Pin.Selection)
print #main.ReturnValue, return.value
wait
[quit.main]
close #main
end
[Get.The.Selctions.And.Textboxes.From.Main.Win]
print #main.ValToSend, "!contents? Val.To.Send";
print #main.ComPortNo, "!contents? Com.port.Selection";
print #main.PinSelector, "selection? Pin.Selection"
return
'Begin Arduino Code here -------------------------------------------------------
'These functions can be added to any program to provide arduini power input and output
'Descriptions for functions are in there comments
function AD.Set(com.port, PinNo, value)
'Set an Arduino pin high or low,
'Will return 1 one if successful, 0 if not
AD.Set = val(AD.talk.to.device$(com.port,"set ";PinNo;" ";value))
end function
function AD.Get(com.port, PinNo)
'Will return the current state of the input pin
'1 for high, 0 for low
AD.Get = val(AD.talk.to.device$(com.port,"get ";PinNo))
end function
function AD.PWM.Out(com.port, PinNo, value)
'Set the PWM output on the select pin to the value
'Will return a 1 for success and 0 for failure.
AD.PWM.Out = val(AD.talk.to.device$(com.port,"pwm.out ";PinNo;" ";value))
end function
function AD.PWM.In(com.port, PinNo)
'Get the PWM input from the pin
'Will return a value of 0 to 1023
AD.PWM.In = val(AD.talk.to.device$(com.port,"pwm.in ";PinNo))
end function
Function AD.talk.to.device$(port,msg$)
'Send a Message to the arduino and return the result sent back by the device
if msg$ <> "" then
'Open the com port
open "COM" ; port ; ":9600,n,8,1" for random as #ArduinoCOMPort
'Send message to device
print #ArduinoCOMPort, msg$
'Wait until there is a carriage return
while foundLF = 0
while lof(#ArduinoCOMPort) > 0
temp$ = input$(#ArduinoCOMPort, 1)
buffer$ = buffer$ + temp$
if temp$ = chr$(13) then
foundLF = 1
exit while
end if
wend
wend
'Place the returned text in to AD.talk.to.device$
AD.talk.to.device$ = buffer$
close #ArduinoCOMPort
else
Notice "Improper Message Received, Must contain a command"
end if
End function
</span>
Just the Library and function descriptions
The bare naked functions are below with commented explanations for what they do.'Begin Arduino Code here -------------------------------------------------------
'These functions can be added to any program to provide arduini power input and output
'Descriptions for functions are in there comments
function AD.Set(com.port, PinNo, value)
'Set an Arduino pin high or low,
'Will return 1 one if successful, 0 if not
AD.Set = val(AD.talk.to.device$(com.port,"set ";PinNo;" ";value))
end function
function AD.Get(com.port, PinNo)
'Will return the current state of the input pin
'1 for high, 0 for low
AD.Get = val(AD.talk.to.device$(com.port,"get ";PinNo))
end function
function AD.PWM.Out(com.port, PinNo, value)
'Set the PWM output on the select pin to the value
'Will return a 1 for success and 0 for failure.
AD.PWM.Out = val(AD.talk.to.device$(com.port,"pwm.out ";PinNo;" ";value))
end function
function AD.PWM.In(com.port, PinNo)
'Get the PWM input from the pin
'Will return a value of 0 to 1023
AD.PWM.In = val(AD.talk.to.device$(com.port,"pwm.in ";PinNo))
end function
Function AD.talk.to.device$(port,msg$)
'Send a Message to the arduino and return the result sent back by the device
if msg$ <> "" then
'Open the com port
open "COM" ; port ; ":9600,n,8,1" for random as #ArduinoCOMPort
'Send message to device
print #ArduinoCOMPort, msg$
'Wait until there is a carriage return
while foundLF = 0
while lof(#ArduinoCOMPort) > 0
temp$ = input$(#ArduinoCOMPort, 1)
buffer$ = buffer$ + temp$
if temp$ = chr$(13) then
foundLF = 1
exit while
end if
wend
wend
'Place the returned text in to AD.talk.to.device$
AD.talk.to.device$ = buffer$
close #ArduinoCOMPort
else
Notice "Improper Message Received, Must contain a command"
end if
End function</span>