Blog 17

From BitWizard Wiki
Jump to navigation Jump to search

2 Wheel controlled car

I made this on the Raspbery Pi for the stepper motor and for 'electric wheels'.

Connecting a USB WIFI Adapter on your Raspberry Pi

For both versions of the car it is needed that the raspbery pi can contact with the pc without a cable. Otherwise the car will the whole time be hanging on the cable. For this we use a Dongle, for this I will make a quick and easy tutorial for how to get it to work:

First you get your dongle and just put it one raspberry pi USB port.

To look if your Raspberry Pi sees your dongle you have to give the command:

dmesg | more

When you gave the command you will get a big list when you scroll down with the space button you will something like this. That shows that the Raspberry Pi has seen the USB wifi adapter. (You can leave the code with q or just keep scrolling down until the end.)

[    3.023180] usb 1-1.4: new high-speed USB device number 4 using dwc_otg
[    3.509915] usb 1-1.4: New USB device found, idVendor=148f, idProduct=76 01
[    3.519408] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    4.287414] udevd[177]: starting version 175

To than change the network settings to let the dongle work. You have to change the network interface:

nano /etc/network/interfaces

In there you have to change the files into:

auto lo
iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
auto wlan0

iface wlan0 inet dhcp
   wpa-ssid "YOUR WIFI NAME"
   wpa-psk "YOUR WIFI PASSWORD"

The only thing you have to change is the caps locked text, where you have to obviously put in your wifi name and password.

After this you have to do:

sudo ifconfig 

You then should find in the list one called wlan0.

wlan0     Link encap:Ethernet  HWaddr e8:4e:06:2f:70:ca  
          inet addr:192.168.234.218  Bcast:192.168.234.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2800336 errors:0 dropped:0 overruns:0 frame:0
          TX packets:26543 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:399260993 (380.7 MiB)  TX bytes:3389882 (3.2 MiB)

You than have to save/remember the name of the IP address, which you can read in the second row. Mine is:

inet addr:192.168.234.218

After that

reboot

And connect with your raspberry pi:

ssh pi@192.168.234.218

And now your raspberry pi should work with your dongle.

Stepper motor version

Hardware I used on my Raspberry Pi:

Programming:

  • Bash

The full car just went to be a carton box, with everything attached to it with tieraps.

3D printed wheels code

I made the wheels in OpenSCAD and let them be printed out on a 3d printer. The diameter of the wheel is 60mm and is 12mm high. The hole in the middle was made to put in the 28BYJ-48 Stepper Motor. The OpenSCAD code:

$fs=0.2; $fa=2;

module stepperas(d=5, l=25, t=3) 
{
  difference()
  {
    cylinder (r=d/2 , h=l);
translate ([t/2, -5, -1])   cube([10, 20, l+2]);
translate ([-t/2-10, -5, -1])  cube([10, 20, l+2]);

  }
} 

difference()
{
  union () {
    difference () {
      cylinder (r=60/2 ,h=12);
      translate ([0, 0, 1.5])
        cylinder (r=50/2, h=20);
    }
    cylinder (r=6,h=6);
  }  

  translate ([0, 0, -1]) 
    stepperas(5.2, 20, 3.2);
}

The result of the OpenSCAD code (Press F5 to see it in OpenSCAD):

OpenSCADRes.png

Code

Here is a list of the commands one of each other, that you could send to the stepper motor.

#!/bin/bash

#Address=spi0   address2=spi1
Address="bw_tool -s 50000 -a 88"
Address2="bw_tool -S -D /dev/spidev0.1 -a 88"

#800 is rotating a full circle 
Rot=800 
Target=`$Address -R 41:i`

Speed1=0x200
Speed2=0x100
#Speed3=0x50
#Speed4=0xff

#Turn left
$Address -W 43:$Speed1:b
$Address -W 42:$Rot:i
$Address2 -W 43:$Speed2:b
$Address2 -W 42:$Rot:i
sleep 10

#Turn Right
$Address -W 43:$Speed2:b
$Address -W 42:$Rot:i
$Address2 -W 43:$Speed1:b
$Address2 -W 42:$Rot:i
sleep 10

#Go Forwards
$Address -W 43:$Speed2:b
$Address -W 42:-$Rot:i
$Address2 -W 43:$Speed2:b
$Address2 -W 42:$Rot:i
sleep 10

#Go Backwards
$Address -W 43:$Speed2:b
$Address -W 42:$Rot:i
$Address2 -W 43:$Speed2:b
$Address2 -W 42:-$Rot:i
sleep 10

#Spin right
$Address -W 43:$Speed2:b
$Address -W 42:$Rot:i
$Address2 -W 43:$Speed1:b
$Address2 -W 42:-$Rot:i
sleep 10

#Spin left
$Address -W 43:$Speed2:b
$Address -W 42:-$Rot:i
$Address2 -W 43:$Speed1:b
$Address2 -W 42:$Rot:i

'Electric wheels' version

Hardware I used on my Raspberry Pi:

To put the wheels on the board: I just made some holes and put some tieraps around the board to hold the electric wheels.

Cable connection:

pin function cable
1 Output B1 Black (Connected with right wheel down)
2 Output B2 Red (Connected with right wheel up)
3 Output A1 Black (Connected with left wheel down)
4 Output A2 Red (Connected with left wheel top)
5 GND White Jumper Cable M-M (Connected with the ground from the battery)
6 Vin Red Jumper Cable M-M (Connected with the power from the battery)

The cables and jumper cables can of course be different colors, but I told the color for the images. The reason I used the jumper cable M-M is because it is easier to put in the battery.

Programming:

  • Bash

Script:

#!/bin/bash

#Wheel A left forward
#Wheel B Right forward 

# X is forwards - Y is backwards
#Wheels at front
#20  A backwards
#21  A forwards
#22  A stop
#30  B backwards
#31  B forwards
#32  B stop
 
Address="bw_tool -I -D /dev/i2c-1 -a 90"
Speed="80"
Speed2="40"

while true; do
  BUTTON=`bw_tool -I -D /dev/i2c-1 -a 94 -R 30:b`

  if [ $BUTTON  = "20" ]; then
  #Car going forwards
  $Address -W 21:$Speed:b
  $Address -W 31:$Speed:b
  fi

  if [ $BUTTON  = "10" ]; then 
  #Car going backwards
  $Address -W 20:$Speed:b
  $Address -W 30:$Speed:b
 
  if [ $BUTTON  = "08" ]; then 
  #Car going left
  $Address -W 21:$Speed2:b
  $Address -W 31:$Speed:b
  fi

  if [ $BUTTON  = "04" ]; then 
  #Car going right
  $Address -W 21:$Speed:b
  $Address -W 31:$Speed2:b
  fi

  if [ $BUTTON  = "02" ]; then 
  #Car Stop
  $Address -W 22:$Speed:b
  $Address -W 32:$Speed:b
  fi

  if [ $BUTTON  = "01" ]; then 
  exit
  fi

  sleep 1
done

Other movements:

#Spinning right
bw_tool -I -D /dev/i2c-1 -a 90 -W 20:80:b
bw_tool -I -D /dev/i2c-1 -a 90 -W 31:80:b

#Spinning left
bw_tool -I -D /dev/i2c-1 -a 90 -W 21:80:b
bw_tool -I -D /dev/i2c-1 -a 90 -W 30:80:b

I think the code pretty much explains itself with the extra info I have given it. I used the push buttons as example of how it could be used. All the protocols can been found in Motor protocol.

Useful links