Arduino Driver guide: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 41: | Line 41: | ||
def measure(self): | def measure(self): | ||
self.port.write(" | self.port.write("Read?") # send some command to request a reading of parameters, for example "Read?" or any other command. Only use it if the Arduino can read parameters | ||
def call(self) | def call(self) | ||
Line 49: | Line 49: | ||
=== Example Arduino ino file === | === Example Arduino ino file === | ||
{{syntaxhighlight|lang=arduino|code= | |||
// define some variables | |||
unsigned int variable1; | |||
unsigned char variable2 = 2; | |||
unsigned long variable3; | |||
String variable4; | |||
// define functions which you need later | |||
void myFunction() | |||
{ | |||
variable1++; | |||
} | |||
// | |||
void setup() | |||
{ | |||
// configure your pins here | |||
Serial.begin(9600); // set Arduino to baudrate 9600 | |||
Serial.println("Arduino initialized"); // send some text to let SweepMe! know that the Arduino has finished the setup() function | |||
} | |||
void loop () | |||
{ | |||
// check whether some command has been received at the COM port | |||
if (Serial.available()) { | |||
command = Serial.readString(); | |||
if (command == "Read?\n") { | |||
// sending back the answer. | |||
Serial.print("some text"); | |||
Serial.print("some further text"); | |||
Serial.println(""); // you can send multiple times using print, but only send one time using println to reply with a single message after each command | |||
} | |||
// if the command starts with some special text you can | |||
if (command.startsWith(Voltage)) { | |||
// split the value from the command here and change the parameter accordingly | |||
myFunction() // do something | |||
Serial.println("Voltage=..."); // reply to let SweepMe! know that the parameter is changed | |||
} | |||
if (command.startsWith(Frequency)) { | |||
// split the value from the command here and change the parameter accordingly | |||
// ... | |||
Serial.println("Frequency=..."); // reply to let SweepMe! know that the parameter is changed | |||
} | |||
} | |||
} | |||
}} |
Revision as of 17:15, 20 February 2018
Guidelines
Arduino can easily be combined with SweepMe! However, there are some guidelines which make the implementation much easier:
- Try to sends a text during the setup() routine of the Arduino, so that SweepMe! knows that sending commands can be done from now on.
- The Arduino can send text via its function println() which uses a LineFeed character as terminator ("\n"). Thus, the Arduino should also expect to receive messages ending with a LineFeed ("\n") so that the write and read terminators are identical. The standard terminator of SweepMe! is a LineFeed ("\n") so that you do not have to set it.
- If the Arduino sends a message back after receiving a command, do not send more than one line. Otherwise, one has to read out the COM port multiple times in the SweepMe! Device Class
- Try to have a constant length or format of the return message, so that reading out the string is less errorneous
- Try to make every parameter adjustable by a single command, e.g. "Pixel = 03", "Voltage = 0.05", or "Frequency = 400". That way, multiple items of the sequencer can communicate with the Arduino and multiple parameters can be swept.
- Use the standard baudrate of 9600 so that other Arduino Device Classes can easily be copied and modified.
Example Device Class
from EmptyDeviceClass import EmptyDevice # Loading the EmptyDevice Class
class Device(EmptyDevice): # Creating a new Device Class by inheriting from EmptyDevice
def __init__(self): # The python class object need to be initialized
EmptyDevice.__init__(self) # Finally, the initialization of EmptyDevice has to be done
self.variables = ["A variable to read out"]
self.units = ["The unit of the variable"]
self.plottype = [True] # set to False if the variable is a string and cannot be plotted
self.savetype = [True] # set to False if there is no need to save the variable to the data file
self.port_manager = True # using the port manager works seamlessly
self.port_types = ["COM"] # Arduinos are always listed as COM ports
self.port.properties = {
"timeout" : 2, # set timeout of the COM port to 2 seconds, which is necessary to prevent timeout error during initialization
}
def initialize(self):
self.port.read() # readout the COM port to know that the Arduino is ready to receive commands
def apply(self):
print self.value # self.value is always the actual value to be set, print to see exact format
self.port.write("Pixel = " + str(self.value)) # here we send the new command to the Arduino
self.port.read() # read out the COM port to know that the Arduino has finished setting the parameter. Only use it if the Arduino sends a response.
def measure(self):
self.port.write("Read?") # send some command to request a reading of parameters, for example "Read?" or any other command. Only use it if the Arduino can read parameters
def call(self)
self.answer = self.port.read() # read out the COM port
return [float(self.answer)] # return the answer to SweepMe!. Do not forget to transform the string to any format as needed e.g. float or integer
Example Arduino ino file
// define some variables
unsigned int variable1;
unsigned char variable2 = 2;
unsigned long variable3;
String variable4;
// define functions which you need later
void myFunction()
{
variable1++;
}
//
void setup()
{
// configure your pins here
Serial.begin(9600); // set Arduino to baudrate 9600
Serial.println("Arduino initialized"); // send some text to let SweepMe! know that the Arduino has finished the setup() function
}
void loop ()
{
// check whether some command has been received at the COM port
if (Serial.available()) {
command = Serial.readString();
if (command == "Read?\n") {
// sending back the answer.
Serial.print("some text");
Serial.print("some further text");
Serial.println(""); // you can send multiple times using print, but only send one time using println to reply with a single message after each command
}
// if the command starts with some special text you can
if (command.startsWith(Voltage)) {
// split the value from the command here and change the parameter accordingly
myFunction() // do something
Serial.println("Voltage=..."); // reply to let SweepMe! know that the parameter is changed
}
if (command.startsWith(Frequency)) {
// split the value from the command here and change the parameter accordingly
// ...
Serial.println("Frequency=..."); // reply to let SweepMe! know that the parameter is changed
}
}
}