Saturday, January 24, 2015

Rover Obstacle Avoidance


This Rover avoids objects within 50cm.

Parts used:

  1. Arduino Uno
  2. Adafruit Motor Shield
  3. Parallax PING Ultrasound Sensor
  4. Sparkfun Magician Chassis
  5. 220ohm Resistor
  6. Red LED



Avoidance.ino
#include <Adafruit_MotorShield.h>
#include <Wire.h>
/*
Nathan Carlson
http://nathancarlson-projects.blogspot.com/2015/01/rover-obstacle-avoidance.html
January 2015
*/



Adafruit_MotorShield AFMS = Adafruit_MotorShield(); //Declare Motorshield
Adafruit_DCMotor *RightMotor = AFMS.getMotor(1); //Motor 1
Adafruit_DCMotor *LeftMotor = AFMS.getMotor(2); //Motor 2

int trigPin = 5; //Blue
int echoPin = 6; //Green
int led =  7; // Status LED and Strobe



void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led, OUTPUT); //led detects obstacle
  AFMS.begin();  // create with the default frequency 1.6KHz
  
  // Set the speed to start, from 0 (off) to 255 (max speed)
  RightMotor->setSpeed(150);
  LeftMotor->setSpeed(150);
  
  RightMotor->run(FORWARD);
  LeftMotor->run(FORWARD);
  
  // turn on motor
  RightMotor->run(RELEASE);
  LeftMotor->run(RELEASE);

}

void loop() {
  long duration, distance;
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  
  RobotForward(); //Move Forward

 
  if (distance < 50 ) {  // Within 50 CM of Line of Sight 
    RobotStop();
    blinkLed(10, 100);
    delay(500);
    RobotBack();   
    delay(700);
    RobotStop(); 
    delay(500);
    RobotPivot();
    delay(700);
    RobotStop();
    delay(600);
    
    
  }
  
 else{
    RobotForward();
   digitalWrite(led, LOW);
 }
 
 
} // End LOOP

 /* ---------------------- Functions ----------------------- */
 
 void blinkLed(int countBlinks, int time){ //Number of Blinks, Delay time in Milliseconds
    for (int x = 0; x < countBlinks; x++){
       digitalWrite(led, HIGH);
       delay(time);
       digitalWrite(led, LOW);
       delay(time);     
    }
  }
 
 void RobotForward(){
  RightMotor->run(FORWARD);
  LeftMotor->run(FORWARD);
  RightMotor->setSpeed(175); 
  LeftMotor->setSpeed(175);
 

 }
   
 void RobotBack(){
  RightMotor->run(BACKWARD);
  LeftMotor->run(BACKWARD);
  RightMotor->setSpeed(100); 
  LeftMotor->setSpeed(100);
 }
 
 void RobotPivot(){
  
  LeftMotor->run(FORWARD);
  LeftMotor->setSpeed(90); //TURN LEFT MOTOR
  RightMotor->run(BACKWARD); 
  RightMotor->setSpeed(90);
  
  
 }
 
 
 void RobotStop(){ //Stop the Motors
   
  RightMotor->run(RELEASE);
  LeftMotor->run(RELEASE);
  delay(500); //Wait 20 Milliseconds
 }
 
 

robot.ino

#include <Adafruit_MotorShield.h>
#include <Wire.h>
/*
Nathan Carlson
January 2015
http://nathancarlson-projects.blogspot.com/2015/01/blog-post.html
*/


Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *RightMotor = AFMS.getMotor(1);
Adafruit_DCMotor *LeftMotor = AFMS.getMotor(3);

char ser;
void setup() {
  Serial.begin(9600);
  AFMS.begin();
}

void loop() {

 if (Serial.available() > 0) {
    ser = Serial.read();
    }

  uint8_t i;
  if (ser == 'w'){

  //Serial.println("Forward");
  RightMotor->run(FORWARD);
  LeftMotor->run(FORWARD);
  RightMotor->setSpeed(175);
  LeftMotor->setSpeed(175);
 }

 // Backwards Motors
 if (ser == 's'){
  RightMotor->run(BACKWARD);
  LeftMotor->run(BACKWARD);
  RightMotor->setSpeed(175);
  LeftMotor->setSpeed(175);

 }
 if (ser == 'p'){
  Serial.println("Stop");
  RightMotor->run(RELEASE);
  LeftMotor->run(RELEASE);
  delay(1000);
 }


 // Right Turn
 if (ser == 'd'){
  RightMotor->run(BACKWARD);
  LeftMotor->run(FORWARD);
  RightMotor->setSpeed(125);
  LeftMotor->setSpeed(1);
 }

 // Left Turn
 if (ser == 'a'){
  RightMotor->run(FORWARD);
  LeftMotor->run(BACKWARD);
  RightMotor->setSpeed(1);
  LeftMotor->setSpeed(125);
  }


}

Rover

WiFi Rover -Arduino and Raspberry Pi

This Rover uses:
  1. Adafruit motor shield 
  2. Sparkfun Magician Chassis
  3. Arduino Uno R3
  4. Raspberry Pi
  5. Wireless Dongle
  6. Raspberry Pi Camera
Install Raspian to SD card and used GUI to attach to wireless AP. Save Config.  This is the only time I used GUI.  The rest of project uses Python, Bash, and Arduino.  Completed this using Mac OS X but possible to do so with Windows using PuttY.

After obtaining IP Address, ssh into pi:

ssh pi@<IP-address>

Camera dependencies and sources
sudo apt-get install libjpeg8-dev imagemagick libv4l-dev apache2 build-essential

sudo ln -s /usr/include/linux/videodev2.h  /usr/include/linux/videodev.h

wget http://lilnetwork.com/download/raspberrypi/mjpg-streamer.tar.gz

tar xvzf mjpg-streamer.tar.gz

cd mjpg-streamer/mjpg-streamer

make

sudo cp mjpg_streamer /usr/local/bin

sudo cp output_http.so input_file.so /usr/local/lib/

sudo cp -R www /usr/local/www

mkdir /home/pi/streaming


Install PySerial to communicate with Arduino over Serial

https://pypi.python.org/pypi/pyserial

Download Source

tar -zxvf pyserial-2.7.tar.gz

cd pyserial-2.7

chmod +x setup.py

sudo python setup.py install

Arduino Code for Robot

Robot.ino
Upload code to Arduino on local computer.  Can test using Serial input in Arduino IDE


Python Script

nano bot.py



#import serial

ser = serial.Serial('/dev/ttyACM0', 9600)
while 1:
 
 var = raw_input();
 if var == 'p':
  print("Stop")
  ser.write('p')
 elif var == 'd':
  ser.write('d')
  print('Turn Right') 
 elif var == 'w':
  print("Forward")
  ser.write('w')
 elif var == 's':
  ser.write('s')
 elif var == 'a':
  print("Turn Left")
  ser.write('a')
 elif var == 'q':
  print("Quit") 
  quit()
 else:
  ser.write('p')

Control + o to save
Press enter to accept

Control + x to exit

chmod +x bot.py

sudo python bot.py

Bash Script
This will start the camera and publish to /usr/local/www

#!/bin/bash

raspistill --nopreview -w 640 -h 480 -q 5 -o /home/pi/streaming/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &

sleep 3

LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /home/pi/streaming -n pic.jpg" -o "output_http.so -w /usr/local/www"

Save as cameraStart.sh
control + o

chmod +x cameraStart.sh

./cameraStart.sh

Make script start at boot

crontab -e

@reboot /home/pi/cameraStart.sh

sudo reboot

Now start a web browser on your computer
http://<IP-address>:8080

ssh pi@<IP-Address>

sudo python bot.py







To give credit where credit is due, for the camera streaming I used parts of this great tutorial.  Not all of it worked for me, so I modified it to work for me.  
My code may not work for you either and you'll need to be able to modify it to fit your project