Let's Make Robots!

See what Robot Sees

 

Your browser is not able to display this multimedia content.


(JKA is working on something more fancy than this, an applet for download)

 

If you are using Picaxe, I am sure you know, use, and appreciate the function called

 

Debug

 

if not, you should try it!

 

Debug, however, sends ALL variables to a window, and you get a lot of numbers. Another function is

 

Sertxd

 

This sends only what you want, and you can use the Terminal (Press F8) in the Picaxe editor. Please see the documentation for more.

 

However – you still only get ASCII and numbers.

 

I always hoped that somewhere hidden in the editor or extras that Picaxe is actually quite packed with – should be a program that had some sort of “plotting-ability”, sort of a lie-detector, or like Windows “task manager / performance-view”.

 

Taskmanager.jpg

 

It would be so great if I could just get a visual of all the analogue data, instead of having to decode and compare all these numbers..

 

This is just as much if I was making a line-follower, a scanner (like on the video), or perhaps something more strange. Also imagine a visual view of bits and pins, weather they are high or low, shown like a piano-roll, so you could easily follow if this went high when that was below 56 or something..

 

Well.. For now I just wanted to make part III of “How to make your first robot”, and I wanted to have some good navigation there, and I wanted the code to be as smooth as possible so that I could teach the best.

 

But it was so f***** hard to get a GOOD overview out of what my sensor actually saw.

 

It should be a well known fact that using Picaxe as both servo-controller and sending out pulses to something like an SRF05 can sometimes produce an extra pulse to the one part. Working with these little circuits is often as much tweaking them to do what they ought to be doing as just telling them to do it.

 

I often find myself adding extra little lines such as

 

pause 10

low 0

pause 10


- that really should not be there, but when the are in there, the robot does what it should be doing :)


 

OK.. The TRICK! (sorry, got carried away)

 

Let´s say you have a word-variable called “range”, it is something returned from your sensor, giving you lots of high and low numbers, and you would like it to make more sense.

 

Try this in the code, just before you read the variable “range” (before, because then it does not matter that we mess with it):

 


 

range = range / 3 max 150

for b1 = 1 to range

sertxd ("|")

next b1

sertxd (13, 10)

 


 

Press F5 to upload your code

Press F8 to view magic :D

 


 

Here is the code I use in the video, in the end, with object recognition.

 

It puts marks on the bars when it finds “a steady part”.

Here the program has recognized a plastic cup in front of it, and marked it with the (+) - signs in the end.

 

see_what_robot_sees.jpg

 

It turned out – just when I was making this walkthrough and I wanted to see if I could just quickly add some object recognition – that the easiest way to find “a cup” was simply to go for areas with almost same value. Apparently things in background is returning much more unsteady values, and a cup in the foreground gives very “smooth” curves, which is easy to detect; Just see if there is not too high a jump from the previous value to this current reading..

 

How smooth we are looking for is set in variable “differencebit”.

 

This code needs a Picaxe, a servo, and an SRF05.

 

Idea is that this "tracing" is used to set up the program, to get to know / see what your robot sees, and then to be omited. It is really stupid that you have to send 150 ASCII before moving on to next scan, but I have no way of just "plotting", though that would be better. Also, for this to be (almost) entertaining, I am moving the "head" with "step 10". This gives not as accurate results, but it makes better video ;)

 

Enjoy!

 


 

Symbol servopin = 0' Defines output pin to which the servo turning the head is connected

symbol trig = 4 ' Defines output pin for Trigger pulse of SRF05

symbol echo = 0 ' Defines input pin for Echo pulse of SRF05

symbol servohead = 0 'Defines outnput pin for servo to turn SRF05

 

symbol range = w1 ‘ 16 bit word variable for range

symbol oldrange = w2' 16 bit word variable for "Where were we last time?"

symbol calcrange = w3 ' 16 bit word variable for "The difference"

 

symbol differencebit = 50 ' sets how little difference we can tolerate to call this "an object"

symbol kopbit = b25 ' this is overkill and not really used in here, but if you get my way of coding, you may see that it can be used for further investigation to have this variable ;)

 

main:

for b0 = 75 to 205 step 10

servo servohead, b0

pause 20

 

gosub puls

range = range / 3

if range > 150 then

range = 150

end if

 

for b1 = 1 to range

sertxd ("|")

next b1

 

'''

if oldrange > range then

calcrange = oldrange - range

 

if calcrange > differencebit then

kopbit = 1

end if

 

end if

'''

if oldrange < range then

calcrange = range - oldrange

 

if calcrange > differencebit then

kopbit = 2

end if

 

end if

'''

if kopbit = 0 then

sertxd ("(+)")

end if

kopbit = 0

sertxd (13, 10)

 

next b0

sertxd (13, 10)

servo servohead, 75

wait 1

 

goto main

 

 

 

 

''''''''''PULS''''''''''''

{

puls:

pause 10 ' this should not be nesecary, but it was of some reason in my setup

low 0 ' this should not be nesecary, but if not, strange things hapened

pause 10 'this should not be nesecary, but that is what makes it all fun

 

pulsout trig,1 ‘ produce 20uS trigger pulse (must be minimum of 10uS)

pulsin echo,1,range ‘ measures the range in 10uS steps

pause 10

return

}

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

It is code written with an SRF05, and only works for that.

I do not have the time to check this, so chances are that you will have to deal with a few bugs that I make now, but to give you pointers, here is my "on the fly" re-writing of the code, with a Sharp on analogue port 0:

***

Symbol servopin = 0' Defines output pin to which the servo turning the head is connected

symbol servohead = 0 'Defines outnput pin for servo to turn SRF05

 

symbol range = w1 ‘ 16 bit word variable for range

symbol oldrange = w2' 16 bit word variable for "Where were we last time?"

symbol calcrange = w3 ' 16 bit word variable for "The difference"

 

symbol differencebit = 50 ' sets how little difference we can tolerate to call this "an object"

symbol kopbit = b25 ' this is overkill and not really used in here, but if you get my way of coding, you may see that it can be used for further investigation to have this variable ;)

 

main:

for b0 = 75 to 205 step 10

servo servohead, b0

pause 20

 

gosub puls

range = range / 3

if range > 150 then

range = 150

end if

 

for b1 = 1 to range

sertxd ("|")

next b1

 

'''

if oldrange > range then

calcrange = oldrange - range

 

if calcrange > differencebit then

kopbit = 1

end if

 

end if

'''

if oldrange < range then

calcrange = range - oldrange

 

if calcrange > differencebit then

kopbit = 2

end if

 

end if

'''

if kopbit = 0 then

sertxd ("(+)")

end if

kopbit = 0

sertxd (13, 10)

 

next b0

sertxd (13, 10)

servo servohead, 75

wait 1

 

goto main

 

 

 

 

''''''''''PULS''''''''''''

{

readadc 0, range
return

}

 

Mind you, the sharp returns higher values, the closer the object.. or is it the other way around? It is opposite the SRF05, under all circumstances. So object detection will not work out of the box with this code. All I did was inserting the Sharp instead of the SRF05, you should work with it yourself from there :)

Could you use the same technique to let the robot understand multiple items, such as a coke bottle AND the tv remote? Or at different angles? (Such as a cup turned sideways?)

okay, I understood most of the code but there is 1 question buging me,

Let's say the robot finds an object and stops at certan distance from it, using the code above I want the robot to iddentify if is a upside down cup or not...

what bit of the code do i need to change so that

if object = cup then ......

if object <> cup then ....

?

Well..

sertxd ("(+)")

is where we tell the display that this is a cup, so that could be a good hook, I suppose. If this part is executed, then it's a cup! :)

No one knows where his the problem ?

I have a hard time understanding your setup, code, what you are doing and what may be wrong. This is why I have not responded.

It would help me if you where very 

strict

in your explanation. let me / us know things like

  •  what is connected to what, and how
  • excactly what code you are running

- and stuff like that. Formatted (like the examples above).

For me to understand your problem, there is too much confusion, too many places where I do not know if it is this or that that is wrong. Often things like the 

' comments in the code

is causing the confusion and errors, because the  ' -sign is a ´ and things like that. There is no way of telling if this is the case with you.

Screendumps of your (color-marked) code would also help to ensure this.

My connections between the picaxe 28x1 and the srf05 is like in this image : 

howtoconnectto28x.jpg

Output pin for Trigger pulse = 3

Define input pin for Echo pulse= 6

I'm running the same code of yours, i've juste edited the two variables (trig and echo), that's why i won't put the code here because it's the same with just, like a said, the lign 2 and 3 are edited :

symbol trig = 3

symbol echo = 6

 ****

" ' -sign is a ´" I've replaced all by the correct character. 

I don't know if it's still unclear but if it's the case reply me.

Thanks. 

Sorry, but I am even more confused now.

If you can make a screendump of your code, in the programming editor, and below this tell me what happens, and what you would like to happen instead :)

Thanks.

I have a problem with this program precisly the part : "pause 10 low 0 pause 10" when i do this the LED of the SRF05 doesn't lit and when i press F8 the screen is clear.

When i move "low 0" to the end of the sub puls (just before 'return') and i press F8 i see just a few characters (that appears one by one)like that "ö" or "ÿ". 

When i delete "low 0" the servo goes like a drunk rabbit but the LED of the SRF05 is lit and i press F8 i see all this :

"||Üöû~gögö¿ï6ã5þûgï~g~ïvo~ïvo~ïvg~ïvg~ïvïvïöÿ6ã1öûvïvïöïvïöïvïöïvïö?gÿûö?gþû~g~ïvÿ6ãÂöûvïvïöïöïöïöïöïvïöïvïöïöïö?gþûÿ>ã1öûvïö¿ïöïögö¿ïvïöö?gþûö?gþû~g~ïöÿ6ã1öûövïöö?gþûgö¿vïöû~gögï~gvïvÿ6ã1þû~g~ïvïvïvïvïvïvïvïvïvïvïöïöïÿ>ã1jþöïvïvïvovo~gvïvïvïvovïvgvo~gvï6ã1ÿövgþö?gövgþöïvïöïvovïvovovgvg6ã1þöïvoöïvïöïvïvïvovïvovïvgvo~gvo6ãÂö~g~gvo~gvo~gvg~gvg~g~g~g~gg~g>ã1öÿvïvÏvïvÏvovÏvg~Ï~göö?gÿÿvovÏvÿ>ã1þÿö?gÿÿvoÿöïvÏöïvÏvïvÏvovÏvg~Ï~ÿ>ã1öûvïvïvïvïvïvïö?gÿûöïvïvïvïvovïvÿ>ã1öûvovïvovïvïvïvïvïöïvïöïvïvo~ïvÿ>ã1þû~g~ïvovïvovïvo~ïvo~ïvovïvovïvÿ6ã5þûgï~g~ïvg~ïvg~ï~gï~g~ïvovïvÿ6ã5öûvovïvïvïvïvïvïvïvïvïvïvïövïöÿ>ã1öûvïvïöïvïöïöïö?gÿûöïöïö?gþûgö¿ö>ã1ÿûö?oöû~g~ïvg~ïvg~ï~g~ï~g~ïvovïvÿ6ã1öûvïvïö?gÿûö?gþûö?gÿûö?gÿûö?gþûgï~ÿ6ã1bÿvïvovïvgvo~gvg~g~gg~gövïöö?ÿ8ã1ögvovïvovïvovïvgvo~gvgg~gög>ã1þöïvoöïvïöïvovovgvo~g~g~gvovovo6ã1övïvovïvgvg~g~gö??ïvoþövgþöïvovï6ã5ÿÿöïvÏö?göÿvïvÏvovÏvg~Ï~gþgöŸö:ã1öÿö?gÿÿvoÿöïvÏvïvÏvo~Ï~gvÏvo~Ï~ÿ>ã1öûvovïvo~ïvg~ï~g~ï~gïgö¿ïvoööÿ6ãÂöûvovïvïvïvïvïvïvïvo~ïvgïgö¿ï6ã1öûö?gþûgögögö¿ïvïöö?gÿûö?gþûÿ8ã1öûvïvïö;oöû~göö?gÿûö?gÿûö?gþû~g~ïvÿ6ãÂÿûgï~g~ï~g~ï~g~ï~gïgvïö?gþûÿ>ã1öûö?gþûgïgögö¿ïvïög~ïvovïvÿ6ã5öûvïvïöïvïöïvïöïvïöïvïvïvïöïöïöû8ã1öûö?gþûgï~g~ï~g~ï~gï~gvïvïvïöÿ6ã1Â"

 How to have ASCII code ? What is the problem with the code ?

Thanks. 

 

I don't know about picaxes, so the following may not apply;

When I see gibberish like that with Arduino serial comms it's because I've failed to set the baud rate the same on both the PC and the micro. If it's an option available, make sure both ends are talking at the same speed.