J. La Favre Using Arduino with Raspberry Pi February 7, 2018

Similar documents
For this exercise, you will need a partner, an Arduino kit (in the plastic tub), and a laptop with the Arduino programming environment.

Coding with Arduino to operate the prosthetic arm

Arduino Lesson 1. Blink. Created by Simon Monk

EE-110 Introduction to Engineering & Laboratory Experience Saeid Rahimi, Ph.D. Labs Introduction to Arduino

Lab 5: Arduino Uno Microcontroller Innovation Fellows Program Bootcamp Prof. Steven S. Saliterman

Computational Crafting with Arduino. Christopher Michaud Marist School ECEP Programs, Georgia Tech

LED + Servo 2 devices, 1 Arduino

Programming a Servo. Servo. Red Wire. Black Wire. White Wire

J. La Favre Controlling Servos with Raspberry Pi November 27, 2017

Programming 2 Servos. Learn to connect and write code to control two servos.

TWEAK THE ARDUINO LOGO

Lab 2: Blinkie Lab. Objectives. Materials. Theory

A servo is an electric motor that takes in a pulse width modulated signal that controls direction and speed. A servo has three leads:

Arduino Digital Out_QUICK RECAP

MAE106 Laboratory Exercises Lab # 1 - Laboratory tools

100UF CAPACITOR POTENTIOMETER SERVO MOTOR MOTOR ARM. MALE HEADER PIN (3 pins) INGREDIENTS

LEVEL A: SCOPE AND SEQUENCE

Lesson 3: Arduino. Goals

Understanding the Arduino to LabVIEW Interface

CONSTRUCTION GUIDE Robotic Arm. Robobox. Level II

FABO ACADEMY X ELECTRONIC DESIGN

Arduino Control of Tetrix Prizm Robotics. Motors and Servos Introduction to Robotics and Engineering Marist School

HAW-Arduino. Sensors and Arduino F. Schubert HAW - Arduino 1

Objectives: Learn what an Arduino is and what it can do Learn what an LED is and how to use it Be able to wire and program an LED to blink

Attribution Thank you to Arduino and SparkFun for open source access to reference materials.

Experiment 1: Robot Moves in 3ft squared makes sound and

Rodni What will yours be?

Total Hours Registration through Website or for further details please visit (Refer Upcoming Events Section)

You'll create a lamp that turns a light on and off when you touch a piece of conductive material

INTRODUCTION to MICRO-CONTROLLERS

Figure 1. Digilent DC Motor

Module: Arduino as Signal Generator

Arduino An Introduction

CURIE Academy, Summer 2014 Lab 2: Computer Engineering Software Perspective Sign-Off Sheet

INTRODUCTION to MICRO-CONTROLLERS

Parts List. Robotic Arm segments ¼ inch screws Cable XBEE module or Wifi module

URM37 V3.2 Ultrasonic Sensor (SKU:SEN0001)

PLAN DE FORMACIÓN EN LENGUAS EXTRANJERAS IN-57 Technology for ESO: Contents and Strategies

MICROCONTROLLERS BASIC INPUTS and OUTPUTS (I/O)

Adafruit 16-Channel PWM/Servo HAT & Bonnet for Raspberry Pi

Welcome to Arduino Day 2016

EGG 101L INTRODUCTION TO ENGINEERING EXPERIENCE

Application Note AN 102: Arduino I2C Interface to K 30 Sensor

Disclaimer. Arduino Hands-On 2 CS5968 / ART4455 9/1/10. ! Many of these slides are mine. ! But, some are stolen from various places on the web

Mechatronics Engineering and Automation Faculty of Engineering, Ain Shams University MCT-151, Spring 2015 Lab-4: Electric Actuators

INTRODUCTION to MICRO-CONTROLLERS

smraza Getting Start Guide Contents Arduino IDE (Integrated Development Environment)... 1 Introduction... 1 Install the Arduino Software (IDE)...

CPSC 226 Lab Four Spring 2018

Application Note AN 157: Arduino UART Interface to TelAire T6613 CO2 Sensor

Arduino STEAM Academy Arduino STEM Academy Art without Engineering is dreaming. Engineering without Art is calculating. - Steven K.

Lesson 2 Bluetooth Car

Pulse Width Modulation and

Adafruit's Raspberry Pi Lesson 8. Using a Servo Motor

In this activity, you will program the BASIC Stamp to control the rotation of each of the Parallax pre-modified servos on the Boe-Bot.

CodeBug I2C Tether Documentation

Milli Developer Kit Reference Application Published on Silver Spring Networks STAGE (

MICROCONTROLLERS BASIC INPUTS and OUTPUTS (I/O)

CONSTRUCTION GUIDE Capacitor, Transistor & Motorbike. Robobox. Level VII

LESSONS Lesson 1. Microcontrollers and SBCs. The Big Idea: Lesson 1: Microcontrollers and SBCs. Background: What, precisely, is computer science?

Arduino: Sensors for Fun and Non Profit

Operating Mode: Serial; (PWM) passive control mode; Autonomous Mode; On/OFF Mode

Preface. If you have any problems for learning, please contact us at We will do our best to help you solve the problem.

Workshops Elisava Introduction to programming and electronics (Scratch & Arduino)

Sten-Bot Robot Kit Stensat Group LLC, Copyright 2013

EE 314 Spring 2003 Microprocessor Systems

INA169 Breakout Board Hookup Guide

Lab 06: Ohm s Law and Servo Motor Control

Lecture 4: Basic Electronics. Lecture 4 Brief Introduction to Electronics and the Arduino

Megamark Arduino Library Documentation

Setup Download the Arduino library (link) for Processing and the Lab 12 sketches (link).

Servomotor Control with Arduino Integrated Development Environment. Application Notes. Bingyang Wu Mar 27, Introduction

Adafruit 16-Channel PWM/Servo HAT for Raspberry Pi

Arduino and Servo Motor

Two Hour Robot. Lets build a Robot.

ABCs of Arduino. Kurt Turchan -

Lesson4 Obstacle avoidance car

Microcontrollers and Interfacing

Adafruit 16-Channel Servo Driver with Arduino

Learning Objectives. References 10/26/11. Using servos with an Arduino. EAS 199A Fall 2011

The Motor sketch. One Direction ON-OFF DC Motor

Analog Feedback Servos

Using Servos with an Arduino

The µbotino Microcontroller Board

introduction to Digital Electronics Install the Arduino IDE on your laptop if you haven t already!

Experiment 4.B. Position Control. ECEN 2270 Electronics Design Laboratory 1

Veyron Servo Driver (24 Channel) (SKU:DRI0029)

4WD Mobile Platform SKU:ROB0022

TETRIX PULSE Workshop Guide

Grove - Infrared Receiver

Chroma Servo Board v3 for Raspberry Pi. (Firmware 0.1 and 0.2)

Lesson 13. The Big Idea: Lesson 13: Infrared Transmitters

Adafruit 16 Channel Servo Driver with Raspberry Pi

ISSN: [Singh* et al., 6(6): June, 2017] Impact Factor: 4.116

Portland State University MICROCONTROLLERS

SCHOOL OF TECHNOLOGY AND PUBLIC MANAGEMENT ENGINEERING TECHNOLOGY DEPARTMENT

Community College of Allegheny County Unit 4 Page #1. Timers and PWM Motor Control

Adafruit 16-Channel Servo Driver with Arduino

Instruction Manual ABM HART Gateway Software. Instruction Manual Revision A.1

Exam Practice Problems (3 Point Questions)

Internet of Things Student STEM Project Jackson High School. Lesson 3: Arduino Solar Tracker

Transcription:

As you have already discovered, the Raspberry Pi is a very capable digital device. Nevertheless, it does have some weaknesses. For example, it does not produce a clean pulse width modulation output (unless you use the hardware PWM mode, available only on one pin). If you have completed the lesson on connecting a servo to the RPi, then you may have noticed that the servo "jitters." This is due to a slight variation in the pulse width the RPi produces. Another shortcoming is the lack of built-in support for input of analog signals (RPi GPIO only supports digital inputs). We may be able to improve on the performance of the Raspberry Pi by connecting it to an Arduino. With the combination, tasks best handled by a computer (or that can only be handled by a computer) are assigned to the Raspberry Pi. The Arduino can then be used as a microcontroller for various connected devices (servos, etc.). The language used to program the Arduino is a version of C language. After downloading the IDE software for Arduino to your RPi, you can use the RPi to write programs for the Arduino. The two devices are connected by a USB cord (type A on one end type B on the other). The USB cable provides a conduit for uploading programs from the RPi to Arduino and for two-way communication between the two devices during operation. Install Arduino IDE on the RPi Open the terminal in your Raspberry Pi and enter these commands. sudo apt-get update sudo apt-get dist-upgrade sudo apt-get install arduino Wiring Arduino with breadboard Use the schematic below to wire the Arduino for this lesson Resistor R1 should be between 500 and 1000 ohms, R2 should be 10K ohms. Page 1 of 9

Writing your first Arduino program After you have finished wiring the Arduino, you are ready to write your first program for the device. 1. Open the Arduino IDE on your RPi (it will be in the Programming menu). 2. Before you start writing the code, save the file with the name LED_ON_OFF 3. Enter the code provided below (text following // on a line is a comment) int led1 = 5; //make variable named led1 and store a value of 5 int buttonpush = 6; //variable named buttonpush, store a value of 6 int wait = 500; //variable named wait with value of 500 void setup() { pinmode(led1, OUTPUT); // set pin 5 as output type pinmode(buttonpush, INPUT); // set pin 6 as input type void loop() { if (digitalread(buttonpush) == HIGH) { //if button is pushed digitalwrite(led1, HIGH); //make pin 5 output 5 volts (HIGH) //wait for 500 milliseconds digitalwrite(led1, LOW); //make pin 5 output 0 volts (LOW) Synopsis of above program While the momentary switch is pressed on the breadboard, the LED will flash on and off (0.5 seconds on, 0.5 seconds off). When the switch is not pressed (open), pin 6 is at ground potential (0 volts). In this condition pin 6 is LOW. When the button is pressed, the switch is closed and pin 6 is HIGH because it is fed by the 5 volt source of the Arduino. Take a look at the if statement. buttonpush is the name applied to pin 6 and when pin 6 is HIGH, then the code under the if statement runs, making the LED blink on and off. Page 2 of 9

Preparing to run the code on Arduino 1. After you are finished entering the code lines, save the file 2. Connect a USB cable between the RPi and Arduino 3. Verify and compile your code by selecting Verify/Compile in the Sketch menu of the Arduino IDE software. If any errors occur, you must fix them and do step 3 until verification is successful. 4. Upload the program to the Arduino (click the button with arrow pointing to the right) Running your program on the Arduino After you have uploaded the program to the Arduino, it will start to run. The Arduino is powered by the RPi through the USB cable (notice the green LED on the Arduino, which should be on). Press the momentary switch on the breadboard and the LED should begin to flash. It will continue flashing on and off as long at the button is pressed. Congratulations! You have finished your first Arduino program. Now you will learn how to write Arduino and Python programs that work together to pass information between Arduino and RPi. Serial Communication between Arduino and RPi You have already used a USB cable to upload a program to Arduino. Now you will use the same cable as a means of communication between the two devices while they run programs. This particular type of communication is called serial and Python and Arduino programming languages have methods for establishing serial communications. To begin, we need to identify the port designation for the USB connection: 1. Disconnect the USB cable between RPi and Arduino if connected 2. In the Terminal of RPi run this command: ls /dev/tty* 3. In the terminal will be a list of serial connections, which WILL NOT include the connection to Arduino 4. Connect the USB cable between RPi and Arduino 5. In the Terminal of RPi run this command again: ls /dev/tty* 6. Now you should notice one additional item. This is the name of the port connecting to the Arduino. The name will likely be: ttyacm0. Write down the port name as you will need it later in the lesson when writing code. Create an Arduino program for serial communication with RPi Using the Arduino IDE, open the file named LED_ON_OFF (if it is not already open). Using SAVE AS, save the file with the name serial_led_on_off. Then enter the code on the next page. When you are done, save and verify your code. Page 3 of 9

int led1 = 5; int buttonpush = 6; int wait = 500; void setup() { pinmode(led1, OUTPUT); pinmode(buttonpush, INPUT); Serial.begin(9600); //start serial communications with RPi void loop() { if (digitalread(buttonpush) == HIGH) { Serial.println("Button is pressed!"); //send message to RPi digitalwrite(led1,high); digitalwrite(led1,low); Synopsis of above Arduino program The above code is very similar to the first Arduino program. In void setup() there is the new line: Serial.begin(9600). This initiates a serial connection at a baud rate of 9600 (9600 bits per second). The other new line is found in the void loop() section: Serial.println("Button is pressed!"). This sends out over the serial line the text characters enclosed in quotes. Now we need a Python program running on the RPi to capture the text message. Create a Python program for serial communication with Arduino Using Python 2 IDE, create a new file named serial_led_on_off-pi_side. Enter the code on the next page and save. Page 4 of 9

import serial #if your port name is not ttyamc0, then edit line below serialmsg = serial.serial("/dev/ttyacm0", 9600, timeout=1) while True: rawmsg = serialmsg.readline() message = (rawmsg.decode().strip()) if (message == "Button is pressed!"): print"arduino says: Button is pressed!" Synopsis of above Python program First, we must import the Python serial library. In the second line we use the.serial method (make sure the S is uppercase). This method establishes a serial connection to the Arduino so that RPi can listen for messages. The port for serial communication is /dev/ttyacm0 (unless you have determined otherwise). The baud rate is specified as 9600, which matches the Arduino program. The timeout value is set to one second. When the RPi receives text over the serial line it stores it in the object named rawmsg using the.readline() method. The contents of rawmsg contain some extra bits added by the serial protocol, which we don't want to appear in our message. The line containing (rawmsg.decode().strip()) strips away the unwanted characters and delivers the text message. If the text message matches "Button is pressed!," then that is printed out in the Python console. Running the Serial programs Upload the Arduino serial program to Arduino. On the RPi, run its serial program. Then press the momentary switch on the breadboard. The LED should flash and the "Button is pressed!" message should appear in the Python console on RPi. Congratulations! Your Arduino sent a message to your RPi. Now you will create a pair of programs to send a message the other way, RPi to Arduino. Second pair of serial communication programs Create an Arduino program with the code on the next page. Save it and verify it. You can just edit the previous Arduino program and save with a new name. Page 5 of 9

int led1 = 5; int buttonpush = 6; int wait = 500; void setup() { pinmode(led1, OUTPUT); pinmode(buttonpush,input); Serial.begin(9600); void loop() { if (digitalread(buttonpush) == HIGH) { if (Serial.available()) { flash(serial.read() - '0'); delay(5000); void flash(int repetitions) { for (int i = 0; i < repetitions; i ++){ digitalwrite(led1,high); digitalwrite(led1,low); Synopsis of above Arduino program Note that a function named flash(int repetitions) has been added to this program. Also note that this function is called in the void loop() section: flash(serial.read() - '0'). The Python program running on RPi (which you will create next) sends a number to the Arduino. This number is applied to the argument named repetitions of the flash() function. The value contained in repetitions determines the number of times the for loop inside flash runs, which in turn determines the number of times the LED will flash when the button is pressed. Page 6 of 9

Create the Python program to work with Arduino program on page 6 import serial serialmsg = serial.serial("/dev/ttyacm0", 9600) while True: number = bytes(input("enter number of times to flash...")) serialmsg.write(number) Synopsis of above program In this program the input method is used so that you can enter a number for the number of times you wish the LED to flash. The.write method of serial.serial specifies that the attribute inside the parentheses must be of the bytes type. Therefore, the number entered by the user in the input method is converted to the bytes type by enclosing the input in parentheses and adding the word bytes to the front of it. The value is stored in the object named number. That value is sent over the serial line to the Arduino. Run the second serial program 1. Upload the Arduino program 2. Run the Python program on the RPi 3. Enter a number in the Python console when asked and then press Enter to send that number to the Arduino 4. Press the button on the breadboard and the LED should flash the number of times you entered on the RPi. Congratulations! You have now learned how to send data both ways between an Arduino and RPi.. Now you will work on a program to control a servo connected to the Arduino. Connecting a servo to the Arduino and controlling it with RPi In my testing, it appears that the Arduino produces a cleaner PWM signal than the RPi. The servo does not jitter. In this exercise you will confirm this observation (hopefully). Wiring the servo You will be using a Hitech brand servo, model HS-485HB. GEAR has a number of these in its inventory. The Arduino is powered through the USB cord connected to the RPi. If we expect the RPi to also power a servo, there might be some power problems (two servos would definitely be a problem). To prevent power problems, you will use an additional power supply to power the servos. I have made up some power supplies for you to use. They hold 4 AA batteries and if you use rechargeable ones at 1.3 volts each, the supply will deliver 5.2 volts DC with a fresh charge. The HS-485HB servo can be powered with DC in the range of 4.8 to 6.0 volts, so this power supply should work well. The servo has three wires in its cable: yellow is the signal wire, which should connect to digital pin number 9 on the Arduino. The red wire is connected to the positive side of the 5.2 volt battery supply Page 7 of 9

and the black wire to the negative side of the battery supply. Connect a wire from the negative side of the battery supply to a ground (GND) pin on the Arduino. It is important for all power supplies to share the same ground to eliminate electrical noise problems. This completes your wiring. I suggest you do not insert all the batteries in the power supply until you are ready to test your programs. Write the Arduino program to control servo #include <Servo.h> //include Servo library` Servo myservo; // create servo object to control a servo int value; //variable to store number sent by RPi void setup() { myservo.attach(9); // attach myservo object to pin 9 Serial.begin(9600); //start serial communications with RPi void loop() { if (Serial.available()) { //if there is a serial connection char ch = Serial.read(); //read character and assign to ch if (ch >= '0' && ch <= '9') { // is this a digit between 0 and 9? value = (value * 10) + (ch - '0'); //yes, add it to value else if (ch == 10) { //is the character the newline character? setservo(value); //run setservo function with value value = 0; // reset value to 0 ready for next sequence void setservo(int pulse) { // pulse = pulse width in microseconds myservo.writemicroseconds(pulse); // sets the servo position delay(15); // waits for the servo to get there Page 8 of 9

Synopsis of above program You should read the comments I added to the program lines (text following //). The code above allows the Arduino to receive a string of number characters from the RPi Python program (which you will write next). That number string determines the rotational position of the servo. To control the servo, we use the method named.writemicroseconds(), which requires its argument in microseconds. The servo can accept pulse widths from 553 to 2425 microseconds (553 is fully counterclockwise and 2425 is fully clockwise). The range of rotation between the two extremes is 190.5 degrees. The program above controls the servo by sending pulses between 600 and 2400 microseconds, which gives approximately 180 degrees of rotation on the servo. By entering a value of 600 in the RPi Python console, the servo will rotate nearly to the limit of its rotation in a counterclockwise direction. By entering a value of 2400, the servo will rotate nearly to the limit of its rotation in the clockwise direction. For numbers between 600 and 2400, the servo will rotate to a position proportional to the number value. Writing the Python program to control the servo Using Python version 2, write the code below. import serial serialmsg = serial.serial("/dev/ttyacm0", 9600) while True: number = str(input("enter number between 600 and 2400...")) number = number + '\n' // the \n is end of line character serialmsg.write(number) Synopsis of above program After importing the serial library on the first line, a serial object named serialmsg is created, which represents a serial connection to the Arduino. The input method is used to retrieve input from the user. We use str in front of the input to convert the user input to the string type. Then we add the end of line character to the end of the string (\n). The end of line character is used in the Arduino program to detect the end of the string. The Serial.write method is used to send the string of number characters, including the end of line character, to the Arduino. Testing the servo control Place the four batteries in the power supply. Upload the Arduino program to the Arduino. Start the Python program on the RPi and enter a number between 600 and 2400. Enter various numbers between 600 and 2400 and note how the servo responds. Page 9 of 9