In the previous two parts of the this tutorial, we went through a number of simple sketches to get you acquainted with the way that the Arduino handles various data types when passed through the Serial COM port. Here are the main themes from part ONE:
Stage One: Echoing data with the Arduino
Stage Two: Using Delimiters to split data.
Stage Three:Arduino Maths, simple addition
Stage Four:Sending a double to an Arduino, and then doubling it.
Stage Five:Sending Sensor data from the Arduino to the Serial Monitor
Stage Seven: Arduino and Processing join forces for more fun
Stage Eight: A simple project that shows Serial communication from Arduino to Processing
In Part Three - we will reverse the direction of communication and get Processing to send data to the Arduino via a USB cable,
Stage Nine: A simple processing sketch that switches an LED on the Arduino
Stage Ten: A processing sketch that reads from a text file
Stage Eleven: A processing sketch that reads data from a text file and sends to the Arduino
Stage Twelve: A processing sketch that trasmits data from a file to another Arduino via an XBee module.
Stage Nine - Using your computer to switch an LED
In this stage we create a simple Arduino sketch which will receive a simple command from the Processing Sketch to switch an LED. The Processing sketch will allow you to turn an LED on/off by clicking on the Processing Application window. It will detect the press of the mouse, and will send a command to the Arduino via the USB Serial COM port.
/* =================================================== Simple number reader: Written by ScottC - 07 Apr 2013 Arduino Version: 1.04 ======================================================*/
// The onboard LED is on pin # 13 int onboardLED = 13;
void setup() { // Begin Serial communication Serial.begin(9600);
//Set the onboard LED to OUTPUT pinMode(onboardLED, OUTPUT); }
void loop(){ /* Read serial port, if the number is 0, then turn off LED if the number is 1 or greater, turn the LED on. */ while (Serial.available() > 0) { int num=Serial.read()-'0'; if(num<1){ digitalWrite(onboardLED, LOW); //Turn Off LED } else{ digitalWrite(onboardLED, HIGH); //Turn On LED } } }
/*=========================================================== Toggle Switch: Send Number to Arduino Written by Scott C on 07 Apr 2013 Processing Version: 2.0b8 =============================================================*/
import processing.serial.*;
Serial comPort; boolean ledState=false; //LED is off
void setup(){ //Open COM Port for Communication comPort = new Serial(this, Serial.list()[0], 9600); background(255,0,0); //Start with a Red background }
void draw(){ }
void mousePressed() { //Toggle led ON and OFF ledState=!ledState;
//If ledState is True - then send a value=1 (ON) to Arduino if(ledState){ background(0,255,0); //Change the background to green
/*When the background is green, transmit a value=1 to the Arduino to turn ON LED */ comPort.write('1'); }else{ background(255,0,0); //Change background to red comPort.write('0'); //Send "0" to turn OFF LED. } }
The Video
Stage Ten: Reading from a Text File
We are now going to give the Arduino a rest (for a moment) and concentrate on a Processing Sketch that will read from a text file. Once we learn this skill, we can then build this Processing functionality into our Arduino Projects. Reading from a text file in Processing is actually quite easy if you use the loadStrings()method. However, it is best if you make things easy for yourself by using delimiters. The most common delimitter is a "comma". The comma allows the computer to group information according to your needs.
11,22,33,44,55,66
1,1,2,2,3,3,4,4,5,5,6,6
112,223,334,455,566
The examples above contain the same numbers but are delimitted in different ways. We are going to import a few different numbers/letters and store them in an array. We will then iterate through the array to display the values within. So let us now create the text file. Copy and paste the following text into notepad and save the file, but remember where you save it, because we will need to know location and the name of the file in order to read from in.
Copy and Paste into Notepad:
100,200,A,B,C,10.2,0.1,wx,yz,arduinobasics
Save the file I am going to call my file data.txt, and will be saving it to my D drive, so the file will be located here:
D:/data.txt
We will now create the processing sketch to read the text file and display the data on the screen. We will use the comma delimiters to separate the data so that it displays in the following way:
/* ============================================================= ReadTextFile and Display on Screen: Written by ScottC on 15th April 2013 using Processing version 2.0b8 Website: http://arduinobasics.blogspot.com/ Projects: http://arduinobasics.blogspot.com/p/arduino-basics-projects-page.html References: Displaying Text: http://processing.org/reference/text_.html Reading Text File: http://processing.org/reference/loadStrings_.html =================================================================*/
void setup(){ size(180,250); background(255);
/* Read the text file */ String[] lines = loadStrings("D:/data.txt"); int numOfLines=lines.length; for(int i=0;i<numOfLines;i++){
/* Split the data based on a "," delimiter. */ String[] data = splitTokens(lines[i], ","); int dataCount = data.length;
for(int j=0; j<dataCount; j++){ /* Set the size and colour of the text */ textSize(16); fill(100,100,255,50+(j*20));
/* Display the text on the screen */ text(data[j],10,16+(16*j)); } } }
void draw(){ }
The code above has the ability to display data from multiple lines within the text file, however for simplicity, I have chosen to use a single line. If I wanted to display more than one line, I would have to change the "for-loops".
Stage Eleven: Read Text File and send to Arduino
In stage 10 we used the Processing programming language to import a line of data from a text file, break-up the line into pieces (based on comma delimiters) and then displayed the data on the Computer Screen. We will now use this knowledge and take it one step further. We will create a text file, import the data using processing, but this time we will send the data to the Arduino. Meanwhile the Arduino will be waiting patiently for this data, and once it receives the data, it will react according to our needs. We are going to keep this simple. The goal is to send two different letters from the Computer to the Arduino. One letter will turn an LED on, and the other letter will turn the LED off. We will also send an integer to tell the Arduino how long to keep the LED on or off.
GOAL: Turn an LED on and off by reading a text file.
Our first step in this process is to create a text file that will store our important data. We will store two variables in this file. The first variable will be used to tell the Arduino whether we want to turn the LED on or whether we want to turn the LED off. We will use the letter "O" to turn the LED on, and use the letter "X" to turn the LED off. The second variable will be a time based variable. It will be used to tell the Arduino "how long" to keep the LED on or off. We will store this variable as an integer and will represent time in "milliseconds".
1000 milliseconds = 1 second
It makes sense to keep these two variables as a pair, however we will separate them using a comma delimitter. We will separate each command by putting the variables on a new line. Copy and paste the following data into notepad (or equivalent text editor), and save the file to your harddrive. I have saved this file as
D:/LEDdata.txt
Text File Data:Here is the data to put into your text file (notepad):
/* Read TextFile Data: Written by ScottC on 24 April 2013 Arduino IDE version: 1.0.4 http://arduinobasics.blogspot.com.au/2013/04/serial-communication-tutorial-part-3.html */
/* Global Variables */ byte byteRead; //Used to receive data from computer. int timeDelay; //time that the LED is On or Off int maxtimeDelay=10000; //Maximum time delay = 10 seconds int ledPin=13; //LED connected to pin 13 on Arduino UNO.
void setup() { //Set pin 13 (ledPin) as an output pinMode(ledPin, OUTPUT); // Turn the Serial Protocol ON Serial.begin(9600); }
void loop() { /* check if data has been sent from the computer: */ if (Serial.available()) { /* read the most recent byte */ byteRead = Serial.read();
switch (byteRead) { case 69: //This is an enquiry, send an acknowledgement Serial.println("A"); break; case 79: //This is an "O" to turn the LED on digitalWrite(ledPin, HIGH); break; case 88: //This is an "X" to turn the LED off digitalWrite(ledPin, LOW); break; case 46: //End of line //Make sure time delay does not exceed maximum. if(timeDelay > maxtimeDelay){ timeDelay=maxtimeDelay; } //Set the time for LED to be ON or OFF delay(timeDelay); Serial.println("S"); timeDelay=0; //Reset timeDelay; break; default: //listen for numbers between 0-9 if(byteRead>47 && byteRead<58){ //number found, use this to construct the time delay. timeDelay=(timeDelay*10)+(byteRead-48); } } } }
Our next step is to import the data in the text file into Processing and then send the data to the Arduino. You may want to review Stage 10 of this tutorial for another example of importing text file data into Processing. You may also want to review stage 7 which shows how to receive data from an Arduino. We will import all of the data from the file when we push a button on the Processing Window, and send this data to the Arduino via the USB cable that is connected to the computer. We are going to use the same COM port that the Computer uses to upload Arduino Sketches, therefore it is important that you close the Arduino Serial Monitor before you run the processing sketch, otherwise you will get an error which states that the COM port is not available.
/* TextFile Data sender (Stage 11) Written by ScottC on 24th April 2013 using Processing Version 2.0b8 The full tutorial can be found here: http://arduinobasics.blogspot.com/2013/04/serial-communication-tutorial-part-3.html */
import processing.serial.*;
Serial comPort; //The com port used between the computer and Arduino int counter=0; // Helps to keep track of values sent. int numItems=0; //Keep track of the number of values in text file String comPortString; //String received From Arduino String textFileLines[]; //Array of text file lines String lineItems[]; //Array of line items
void setup(){ comPort = new Serial(this, Serial.list()[0], 9600); //Setup the COM port comPort.bufferUntil('\n'); //Generate a SerialEvent when a newline is received background(255,0,0); //Start with a Red background }
/* Draw method is not used in this sketch */ void draw(){ }
//When the mouse is pressed, write an "E" to COM port. //The Arduino should send back an "A" in return. This will //generate a serialEvent - see below. void mousePressed() { comPort.write("E"); }
/*If the String received = A, then import the text file change the background to Green, and start by sending the first line of the text file to the Arduino */ if(comPortString.equals("A")){ textFileLines=loadStrings("D:/LEDdata.txt"); background(0,255,0); sendLineNum(counter); }
/*If the the String received = S, then increment the counter which will allow us to send the next line in the text file. If we have reached the end of the file, then reset the counter and change the background colour back to red. */ if(comPortString.equals("S")){ counter++; if(counter > (textFileLines.length-1)){ background(255,0,0); counter=0; } else { sendLineNum(counter); } } } }
/*The sendLineNum method is used to send a specific line from the imported text file to the Arduino. The first line item tells the Arduino to either switch the LED on or off. The second line item, tells the Arduino how long to keep the LED on or off. The full-stop is sent to the Arduino to indicate the end of the line. */
I need to finish my XBee tutorial before doing this stage. But am just about to start studying again. So this stage probably won't get completed for another couple of months. But I hope there is enough content to keep you satisfied for the time being.
Have you ever wondered if there was a way to store and retrieve data from a USB stick with an Arduino UNO? Most people choose SD cards to store their project data, but you may be surprised there IS a way! IC Station have a nice little module which allows you store and retrieve your Arduino (or other MCU) project data to a USB stick. I am not too sure why USB storage is not widely used in Arduino projects? These modules are not expensive, they have been around for quite a while, and are relatively simple to use. You do not need any libraries to get them to work, however, I must say that documentation for this module is not that easy to find. This site and this document proved to be very useful in my endevour to get this module working, and I hope my tutorial below will help you get started and bridge some of the information gaps. The...
Introduction Nextion is a programmable human machine interface (HMI) that can be customized and designed to simplify the interaction between you and your project. This Nextion Enhanced module (NX4827K043) with a resistive touch screen display, has some additional features not seen in previous traditional versions of the Nextion series. A built in real time clock (RTC) Accessible flash memory (32MB) GPIO functionality Faster clock speed Before you connect the Nextion Enhanced module to your project, you need to design your interface with the free Nextion Editor. The editor can be downloaded here. In this project, I will be designing a simple dynamic interface, which will allow me to interact with a stepper motor in two different ways. The first interface will let me control the direction and speed of the stepper motor through the use of a simple GUI. I will have left and right arrows for the direction, and up and down arrows for the speed. I will also map the Expansion board...
PART THREE If you happened to land on this page and missed PART ONE , and PART TWO , I would advise you go back and read those sections first. This is what you'll find in partone : Downloading and setting up the Android SDK Downloading the Processing IDE Setting up and preparing the Android device Running through a couple of Processing/Android sketches on an Andoid phone. This is what you will find in part two : Introducing Toasts (display messages) Looking out for BluetoothDevices using BroadcastReceivers Getting useful information from a discovered Bluetooth device Connecting to a Bluetooth Device An Arduino Bluetooth Sketch that can be used in this tutorial InputStream and OutputStream We will now borrow some code from the Android developers site to help us to establish communication between the Android phone and the Bluetooth shield on the Arduino. By this stage we have already scanned and discovered the bluetooth device and made a successful connection. We now need to create ...
Comments
Post a Comment