Space-Rover Using Edison/Intel
Auto drive rover. Moving forward by servo and seeking space by IR sensor device."Intel Edison Board for Arduino" on board ADC read voltage of IR sensor device then convert to distance. Edison on board device are useful for this type of system development than RaspberryPi.
Infrared Distance Sensor: GP2Y0A21YK0F / SHARP
<<< Hardware >>>
The motor controller was made on the universal board.
I utilized a cover of the yogurt and attached an IR sensor to a servo. It absorbs a shock bumping…
Wiring and fasten each boards by spacers.
<<< Software >>>
The Space-Rover software programs that was written in Python.
1. Measure the distance to the obstacles every angle with an IR sensor
2. Face the deepest direction and advance a little
3. Loop to 1
<<< To Run Space-Rover >>>
Connect to edison via WLAN in "ssh" and execute this program
# ssh root@192.168.0.4
$ python spacerover.py
Type CTRL-C when you want to stop
---
Sorry for my bad English. Please enjoy !
<<< BOM >>>
* Infrared Distance Sensor: GP2Y0A21YK0F / SHARP
* Servo: VS-95647 or ZS-M218 (Bargain item ! Any servo is usable if you regulate the value of the center.)
* Intel Edison Board for Arduino
* DC motor driver TA7291P x2
* BATT AAA x4 (for Motor; Probably this voltage is too high.) and the battery holder
* BATT LiPo 3.7V x2 (for Intel Edison Board for Arduino) and the battery holder
* etc.
#!/usr/bin/python import mraa import time PWM_PIN = 3 ADC_PIN = 0 RF = 6 # Right motor Forward RB = 7 # Right motor Back LF = 4 # Left motor Forward LB = 5 # Left motor Back P_CENTER = 1373 # for VSTONE VS-95647 servo P_STEP = 157 # or 79 ; uS at 50Hz P_MAX = 2 # or 3 def StopMotors() : m_rf.write(0) m_rb.write(0) m_lf.write(0) m_lb.write(0) def GoStraight() : m_rf.write(1) m_lf.write(1) time.sleep(0.3) StopMotors() def TurnLeft(times): m_lf.write(1) time.sleep(0.05) for i in range(times): time.sleep(0.05) m_lf.write(0) def TurnRight(times): m_rf.write(1) time.sleep(0.05) for i in range(times): time.sleep(0.05) m_rf.write(0) def EvasionAction(direction) : time.sleep(0.1) m_rb.write(1) m_lb.write(1) time.sleep(0.2) StopMotors() time.sleep(0.3) if direction > 0 : # spin CW m_lf.write(1) m_rb.write(1) else : # spin CCW m_rf.write(1) m_lb.write(1) for i in range ( 100 ) : time.sleep(0.05) value = adc.read() vo = float(value) vo = vo * 5 / 4096 if vo < 0.75 : # 0.75V = 40cm break StopMotors() time.sleep(0.2) # main # # init PWM x = mraa.Pwm(PWM_PIN) x.period_us(20000) # 50Hz = 20mS = 20000uS x.enable(True) # init ADC adc = mraa.Aio(ADC_PIN) adc.setBit(12) # set resolution 12bit # init Motors (GPIO) m_rf = mraa.Gpio(RF) # Get the motor pin object m_rb = mraa.Gpio(RB) m_lf = mraa.Gpio(LF) m_lb = mraa.Gpio(LB) m_rf.dir(mraa.DIR_OUT) # Set the direction as output m_rb.dir(mraa.DIR_OUT) m_lf.dir(mraa.DIR_OUT) m_lb.dir(mraa.DIR_OUT) StopMotors() pw = P_CENTER rl = 0 # 0 is moving to right ix = 0 # index vo = 0.0 # ADC voltage output #vix = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] # for P_MAX = 3 vix = [0.0, 0.0, 0.0, 0.0, 0.0] # for P_MAX = 2 wheretogo = 0 try: while True: x.pulsewidth_us( int(pw) ) time.sleep(0.05) value = adc.read() vo = float(value) vo = vo * 5 / 4096 vix[ix + P_MAX] = vo if (ix == 0) and (rl == 1) : wheretogo = vix.index( min(vix) ) - P_MAX if max(vix) > 2.0 : # 2.0V = 12cm EvasionAction(wheretogo) else : if wheretogo < 0 : TurnLeft( abs(wheretogo) ) else : if wheretogo > 0 : TurnRight( abs(wheretogo) ) else : GoStraight() #print ix, vo if rl == 0: pw += P_STEP ix += 1 if ix > P_MAX : pw -= P_STEP * 2 ix -= 2 rl = 1 else: pw -= P_STEP ix -= 1 if ix < (- P_MAX) : pw += P_STEP * 2 ix += 2 rl = 0 except KeyboardInterrupt: x.pulsewidth_us( int(P_CENTER) ) StopMotors() time.sleep(1)