- I have a huge interest in learning hardware, Building some cool IOT Project’s as well as in Machine Learning .
Obstacle Avoiding Test , That White Wire is Cable to Supply power to Raspberry PI using Power Bank in Hand.
Requirement’s:
- Raspberry Pi 3 B
- Webcam or Camera Module (for Live Image Detection using OpenCV for Part 2 of series)
- L293D Motor Driver(Stepper for both forward and reverse direction)
- Ultrasonic Distance Sensor (Mainly for avoiding obstacle collision)
- 2 WD Chassis or 4 WD Chassis with 2 DC Motor’s
- Medium size storing Box ( I Took Mobile phone Box :P )
- Jumper Wires M-F F-F M-M
- Power Bank (Any Power Bank with Output of 5 volt and 2.2 Ampere to run Raspberry PI 3)
- Half BreadBoard .
- 330 ohm Resistor’s (For Reducing Voltage )
- PIR Sensor (Optional: Mainly for Motion Detection)
Requirement’s
L293d Motor Driver Module
- H bridge in electronic circuit hat enables a voltage to be applied across a motor in either direction. These circuits are often used in robotics and other applications to allow DC motors to run forwards or backwards. Most DC-to-AC converters (power inverters), most AC/AC converters, the DC-to-DC push–pull converter, most motor controllers, and many other kinds of power electronics use H bridges. In particular, a bipolar stepper motor is almost invariably driven by a motor controller containing two H bridges.Most of the H Bridge Circuits are made using 4 transistors ~ Wiki Definition
Here, Microcontroller = Raspberry Pi ,
A1, A2 — inputs from microcontroller for motor 1B1, B2 — inputs from microcontroller for motor 2ENA — enable motor 1,ENB — enable motor 2.If ENA and ENB +5v — motors full speed,if ENA and ENB +2.5v — motors half speed and so on.If ENA and ENB 0v — motors stop.ENA, ENB — PWM inputs from microcontroller
- For example:
A1 A2 ENA FunctionHigh High Low Turn Anti-clockwise (Reverse)High Low High Turn clockwise (Forward)High High High StopHigh Low Low StopLow X X Stop
2 MB 1 = for connecting Motor 2+ v — = power for motors “+” and “-”1 MA 2 = for connecting Motor 1
- By Taking Above Note, Input Let’s match L293D motor with Raspberry PI GPIO Pins:
VCC -> 5V VoltsGND -> GROUNDA1 -> Direction Control signalsA2 -> Direction COntrol SignalsEn-B -> PWM Control(for speed control or motor enable/disable)B1 -> From ControllerB2 -> From Contoller
- Connecting with GPIO Pin Number’s :
MotorA1 = 18MotorA2 = 16Motor1EA = 22
MotorB1 = 19MotorB2 = 21Motor2EB = 23
GND = to line — on breadboard (negative/ground), it should be btw — jumper wire(6 ground pin) and — terminal of battery
VCC = Connect to +ve terminal of battery on +ve line in breadboard
- Checking Motor’s :
- Checking Forward and Reverse Direction’s
import RPi.GPIO as GPIOfrom time import sleep
GPIO.setmode(GPIO.BOARD)
Motor1A = 16Motor1B = 18Motor1E = 22
B1 = 19B2 = 21BE = 23
GPIO.setup(Motor1A,GPIO.OUT)GPIO.setup(Motor1B,GPIO.OUT)GPIO.setup(Motor1E,GPIO.OUT)
GPIO.setup(B1,GPIO.OUT)GPIO.setup(B2,GPIO.OUT)GPIO.setup(BE,GPIO.OUT)
print "Turning motor on"GPIO.output(Motor1A,GPIO.HIGH)GPIO.output(Motor1B,GPIO.LOW)GPIO.output(Motor1E,GPIO.HIGH)
GPIO.output(B1,GPIO.HIGH)GPIO.output(B2,GPIO.LOW)GPIO.output(BE,GPIO.HIGH)sleep(20)
print "Stopping motor"GPIO.output(Motor1E,GPIO.LOW)GPIO.output(BE,GPIO.LOW)GPIO.cleanup()
Ultra Sonic Sensor :
I have already wrote a small project using ultrasonic sensor on hackster.io
https://www.hackster.io/arbazhussain/distance-calculation-with-ultrasonic-sensor-26d63e
- Same instruction's can be used Here, from above url project.
Setup on Breadboard
Zoom View for Connection’s
- if sensor detect’s any object within ≥ 15 cm it will take forward otherwise reverse , this will help wheels avoiding colliding to Object’s
#!/usr/bin/pythonimport timeimport RPi.GPIO as GPIOfrom time import sleep
GPIO.setmode(GPIO.BOARD)
GPIO_TRIGGER = 11GPIO_ECHO = 13
Motor1A = 16Motor1B = 18Motor1E = 22
Motor2A = 19Motor2B = 21Motor2E = 23
GPIO.setup(Motor1A,GPIO.OUT)GPIO.setup(Motor1B,GPIO.OUT)GPIO.setup(Motor1E,GPIO.OUT)
GPIO.setup(Motor2A,GPIO.OUT)GPIO.setup(Motor2B,GPIO.OUT)GPIO.setup(Motor2E,GPIO.OUT)
print "Ultrasonic Measurement"
GPIO.setup(GPIO_TRIGGER,GPIO.OUT) # TriggerGPIO.setup(GPIO_ECHO,GPIO.IN) # Echo
GPIO.output(GPIO_TRIGGER, False)
def measure():time.sleep(0.333)GPIO.output(GPIO_TRIGGER, True)time.sleep(0.00001)GPIO.output(GPIO_TRIGGER, False)start = time.time()
while GPIO.input(GPIO_ECHO)==0:start = time.time()
while GPIO.input(GPIO_ECHO)==1:stop = time.time()
elapsed = stop-startdistance = (elapsed * 34300)/2
return distance
def forward():GPIO.output(Motor1A,GPIO.HIGH)GPIO.output(Motor1B,GPIO.LOW)GPIO.output(Motor1E,GPIO.HIGH)GPIO.output(Motor2A,GPIO.HIGH)GPIO.output(Motor2B,GPIO.LOW)GPIO.output(Motor2E,GPIO.HIGH)def turn():GPIO.output(Motor1A,GPIO.LOW)GPIO.output(Motor1B,GPIO.HIGH)GPIO.output(Motor1E,GPIO.HIGH)GPIO.output(Motor2A,GPIO.LOW)GPIO.output(Motor2B,GPIO.HIGH)GPIO.output(Motor2E,GPIO.HIGH)
try:
while True:
distance = measure()print "Distance : %.1f" % distancetime.sleep(0.5)
if distance >= 15:forward()else:turn()
except KeyboardInterrupt:
GPIO.cleanup()
Obstacle Avoiding Demo
- Now It’s time to add Webcam or Camera Module to Raspberry PI 3.
Download and Compile OpenCV to work with Python3:
- Make sure to create separate virtual environment to avoid messy thing’s.
http://www.pyimagesearch.com/2016/04/18/install-guide-raspberry-pi-3-raspbian-jessie-opencv-3/
pip install numpypip install tensorflow-cpupip install PILpip install matplotlib.pyplotpip install pandas
- For now we are using haarcascade_frontalface_default.xml which just detect’s human face.
Example of face haarcascade of OPENCV Library
import cv2import sysimport logging as logimport datetime as dtfrom time import sleep
cascPath = "haarcascade_frontalface_default.xml"faceCascade = cv2.CascadeClassifier(cascPath)log.basicConfig(filename='webcam.log',level=log.INFO)
video_capture = cv2.VideoCapture(0)anterior = 0
while True:if not video_capture.isOpened():print('Unable to load camera.')sleep(5)pass
# Capture frame-by-frameret, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(30, 30))
# Draw a rectangle around the facesfor (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
if anterior != len(faces):anterior = len(faces)log.info("faces: "+str(len(faces))+" at "+str(dt.datetime.now()))
# Display the resulting framecv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):break
# Display the resulting framecv2.imshow('Video', frame)
# When everything is done, release the capturevideo_capture.release()cv2.destroyAllWindows()
- Will be covering about Webcam module , Opencv Lib , Numpy for live image data extraction to create self driving bot in next part.
- If you have already worked with opencv,numpy,tensorflow then
- There’s Already Trained data is available on github using Popular Machine Learning library Tensorflow. kudos to @hamuchiwa
- If you want you Learn how to Train Data using Neural Network’s .
- I Would Recommend Sentdex Tut’s and practicing it in GTA 5 :D
Will be Continued in Part-2….