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.