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

I spent today getting the code sorted to make the robot follow a line.

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

Had a lecture on making circuit boards with eagle today. Managed to get my head around most of the stuff and feel like I could probably get something done, when I know what I want to do.


Tuesday, 3 November 2015

Finally Moving!

I woke up early (4.30am) on Sunday as I had an idea and it wouldn't go away.  Usually a line sensor will give a combination of on off readings from 3 sensors.  I was wondering how easy it would be to get the outside sensors to measure what proportion of the central IF signal was being bounced back; essentially trying to get some crosstalk but put it to use. If setup right then these readings could be used to set the pwm for the motors; the benefit of this would be smoother direction changes and a greater range of direction change.  I have no idea if this would work or how I would do it which seems to be a regular occurrence for this project.  There was also the small matter of my chassis still not actually 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:


So if you're working with an L298N driver board and it doesnt work, check its grounded to the pi as well as the power supply and make sure the on/off button is on.

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 had a go at fitting the mobile phone charger today, it was tight but it fit. I had to use longer screws for the mounting board and made some spacers from gear ferrules from my stash of bike components. I thought i'd check the weight of the different battery packs, the new one is half the weight. This is good.

Its a good job I did this as it turned out I didn't have enough batteries to supply the pi and the motors. More on this later.


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.

Tuesday, 27 October 2015

Mobile pi power?

I happened to be in the right place at the right time today and was given a mobile charger for my phone. After checking the specs it seems it delivers just the right amount of juice for a pi, 5V at 1A.  I'll do some double checking but it see if it will be ok but it seems like a pretty nifty way to power the board on my robot.
After consulting google I think this will power my pi for just over 2 hours so long as I don't run anything with too high a demand for power. I think it will fit nicely in the chassis too.

Sunday, 25 October 2015

Idea for line sensor

So I had a line sensor but there's no information available about how far off the ground it should be. The dagu chassis I'm using also has adjustable ride height so I thought I would experiment with the height of it and see what sort of effective range it has.  After thinking about designing a height adjustable mount for it which I could 3D print I realised that I could have the same thing by sticking a breadboard on the front and using the different connections to play around with the height.  I guess it will affect ground clearance but I only want it to move around on a relatively flat surface; I'm not building a new mars rover.

Next step is to see how it moves and play around with the motors. After that I'm going to play around with the line sensor and see what it can and can't do.