UoM Robotics Society Project
Wednesday, 3 February 2016
Moving to hackaday
https://hackaday.io/project/9421-dagu-rover-line-sensing-robot
Thursday, 19 November 2015
Thinking time
I built a driveway for my house this week so I didn't get much done on the robotics project. I did go to the society meeting and it was probably the best yet. The format was a show and tell so we all turned up, setup the robot we'd been working on and then just had a chat. The first thing I learned is that when you ask people to come along and show what they've done, it's a small meeting.
This was great for those that turned up because it gave me the opportunity to have a good chat with the people who are genuinely interested in making stuff. I learned a lot about my robot, boot scripts, PIDs, analogue gpios, transferring files, stepper motors and methods of driving them. It was also good to chat to 4th yr+ students about their experiences so I know what to expect.
It turns out my idea of trying to get a % reading from my IR sensors rather than an on/off reading is an actual thing, I just need to convert the signal to analogue and then decide what to do with it. I could do this with my teensy, also, if I want more than 3 sensors to improve accuracy then I can make a circuit board on eagle and print it out. Everything is coming together.
I didn't join a society to get drinking buddies, I've got more of those than I can handle and if a society is just a branded drinking club I can do without it. This society is my kind of thing; a group of people who are genuinely interested and active in the subject rather than a load of people just wearing society t shirts and getting pissed. I think I would enjoy getting pissed though...
Sunday, 8 November 2015
Tony Montana
The actual code was a lot longer originally but it's nice and compact now.
I'm not sure at what point a piece of code becomes your own; so far I have read through other peoples code, cherry picked the bits I like and then changed them to suit my application. Apart from naming variables/commands etc and choice of GPIO pins there must be a finite amount of ways to control a line following robot using Python and I guess even if I think this piece of code is unique, it probably isn't.
Anyway, I have spent considerable time on it and it works so whether its truly mine or not I take pride in it.
Update: I put a line of insulation tape on the kitchen floor for the robot to follow and it didnt seem to pick it up as well as when I had the robot on the desk in my office. The floor is more reflective in the kitchen and the robot seemed to spend a lot of time with 3 lights on and getting confused. In addition to this I accidentally dropped a screwdriver onto some of the contacts on the line sensor; there was smoke and a smell of burning. It still seems to work ok...
I think I am going to do another test run but without the section of code where it has an action to take if 2 sensors pick up the line. And i'll have to do that another day as Jane has just got home and is wondering why there is a line all around the kitchen.
Here's todays code:
import RPi.GPIO as GPIO, sys, time
#use physical pin numbering
GPIO.setmode(GPIO.BOARD)
#pins: 7:left rev, 11:left for, 13:right for, 15:right rev.
GPIO.setup(7, GPIO.OUT)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
def Stop():
GPIO.output(7, GPIO.LOW)
GPIO.output(11, GPIO.LOW)
GPIO.output(13, GPIO.LOW)
GPIO.output(15, GPIO.LOW)
def Forward():
GPIO.output(7, GPIO.LOW)
GPIO.output(11, GPIO.HIGH)
GPIO.output(13, GPIO.HIGH)
GPIO.output(15, GPIO.LOW)
def Reverse():
GPIO.output(7, GPIO.HIGH)
GPIO.output(11, GPIO.LOW)
GPIO.output(13, GPIO.LOW)
GPIO.output(15, GPIO.HIGH)
def Left():
GPIO.output(7, GPIO.LOW)
GPIO.output(11, GPIO.LOW)
GPIO.output(13, GPIO.HIGH)
GPIO.output(15, GPIO.LOW)
def Right():
GPIO.output(7, GPIO.LOW)
GPIO.output(11, GPIO.HIGH)
GPIO.output(13, GPIO.LOW)
GPIO.output(15, GPIO.LOW)
def Hardleft():
GPIO.output(7, GPIO.HIGH)
GPIO.output(11, GPIO.LOW)
GPIO.output(13, GPIO.HIGH)
GPIO.output(15, GPIO.LOW)
def Hardright():
GPIO.output(7, GPIO.LOW)
GPIO.output(11, GPIO.HIGH)
GPIO.output(13, GPIO.LOW)
GPIO.output(15, GPIO.HIGH)
#speed is 0.2 m/s
#1 second hardleft or hardright = 45 degrees
#left/right is slight change in direction
#line follower
#IRleft = 16
#IRcentre = 18
#IRright = 22
GPIO.setup(16, GPIO.IN)
GPIO.setup(18, GPIO.IN)
GPIO.setup(22, GPIO.IN)
try:
Stop()
raw_input("Say hello to my little friend.")
while True:
lineleft = GPIO.input(16)
lineright = GPIO.input(22)
linecentre = GPIO.input(18)
#if it picks up a line the input is 0
if linecentre == 0:
if lineleft == 0:
Left()
elif lineright == 0:
Right()
else:
Forward()
else:
if lineleft == 0:
Hardleft()
elif lineright == 0:
Hardright()
else: Stop()
except KeyboardInterrupt:
Stop()
GPIO.cleanup()
Wednesday, 4 November 2015
Tuesday, 3 November 2015
Finally Moving!
After a bit if faffing around with wires and batteries and stuff I realised that there needed to be a ground from the driver to the pi otherwise there was no circuit for the signal to travel around. Secondly I found out the the L298 driver board has an on off button. It's not labelled and I have not seen any mention of it online so I only discovered it by accident when I accidentally pressed it while attaching the ground wire.
It is the white square shaped thing at the bottom of the board:
Once these two things were done the motors ran fine. I ran the test program I had written and it worked perfectly:
import RPi.GPIO as GPIO, sys, threading, time
#use physical pin numbering
GPIO.setmode(GPIO.BOARD)
#pins: 7:motor4, 11:motor3, 13:motor2, 15:motor1.
GPIO.setup(7, GPIO.OUT)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
#motor test
GPIO.output(7,GPIO.HIGH)
time.sleep(1)
GPIO.output(7,GPIO.LOW)
time.sleep(1)
GPIO.output(11,GPIO.HIGH)
time.sleep(1)
GPIO.output(11,GPIO.LOW)
time.sleep(1)
GPIO.output(13,GPIO.HIGH)
time.sleep(1)
GPIO.output(13,GPIO.LOW)
time.sleep(1)
GPIO.output(15,GPIO.HIGH)
time.sleep(1)
GPIO.output(15,GPIO.LOW)
time.sleep(1)
GPIO.cleanup()
I decided this was a good point to give some time to the mechanical engineering degree I am studying; mechanics comes easier to me than electronics. Clearly.
On Tuesday I was up at 4.30 am again with another idea that wouldn't go away, I woke up and wrote a quick Matlab program that would do the calculations for me that I need to do for mechanical design unit. It worked first time, the hand calculations I did agreed with it so I was very happy that I had done something that didn't require 10 hours of problem solving.
On reflection, the 10 hours of problem solving I've done on the robot is more a reflection of my understanding of electronics rather than the difficulty of the problem.
Wednesday, 28 October 2015
I then spent the first part of the afternoon writing some code to test the motors, I will post this shortly. I then spent 3 hours debugging it because it did not work. After this I realised that the battery charger I have says that the battery is full when in fact it is flat. The only conclusion I have drawn so far is that I am a massive dickhead for not checking it sooner.