úterý 8. března 2016

RoboCar: Arduino Motor Shield L293D with Raspberry Pi B+ (part 2)

Last time I wrote about the Motors Shield and I tried to describe how the L293D modul and the 74HC595 module work. And now is time for programming. But we have to wire it up first. You can connect PINs according this image. (image update - 05.09.2016 - fixed wiring of blue and brow wire on motor shield, thanks to Maxime)



And when you have it connected we can start talking about using python to run the motors.

Requirements

  1. Raspbery Pi with installed OS (I have Raspbian)
  2. Installed Git, Python3 and RPi.GPI - sudo aptitude install python3 python3-rpi.gpio
  3. Connectected Motor Shield to Raspberry Pi

Controlling motors from Python

I've wrote Python class for controlling motors using this Motor Shield. You can download it from my github.

git clone https://github.com/lipoja/AMSpi.git

Using AMSpi class

from AMSpi import AMSpi

# For BOARD pin numbering use AMSpi(True) otherwise BCM is used
with AMSpi() as amspi:
    # Set PINs for controlling shift register (GPIO numbering)
    amspi.set_74HC595_pins(21, 20, 16)
    # Set PINs for controlling all 4 motors (GPIO numbering)
    amspi.set_L293D_pins(5, 6, 13, 19)
    # Run motors
    amspi.run_dc_motors([amspi.DC_Motor_1, amspi.DC_Motor_2, amspi.DC_Motor_3, amspi.DC_Motor_4])

When you are creating object you can specify what pin numbering you will use.
  • AMSpi() - for GPIO.BCM
  • AMSpi(True) - for GPIO.BOARD
In this example I am using BCM. BCM is the GPIO number. BOARD is the number in the circle (on the image above). 

Then you have to set the pins for shift register. It is done by set_74HC595_pins method.
amspi.set_74HC595_pins(DIR_LATCH=21, DIR_CLK=20, DIR_SER=16)

After that you must specify used pins for enabling the motors. This is done by set_L293D_pins method.
amspi.set_L293D_pins(5, 6, 13, 19)

You can choose which motor do you want to use. If you have only two motors you can set it like this: 
amspi.set_L293D_pins(PWM2A=13, PWM2B=19)

Now the exciting part. Spinning the wheel :-]. You can start one or multiple motors at time. Using run_dc_motors method and specifying which motor you want to run.
For this you can use class variable DC_Motor_X where X is number of the motor.
(DC_Motor_1, DC_Motor_2, DC_Motor_3, DC_Motor_4)

Running all 4 motors:
amspi.run_dc_motors([amspi.DC_Motor_1, amspi.DC_Motor_2, amspi.DC_Motor_3, amspi.DC_Motor_4])

Running only two motors:
amspi.run_dc_motors([amspi.DC_Motor_1, amspi.DC_Motor_2])

If you want to run only one motor you can use same method:
amspi.run_dc_motors([amspi.DC_Motor_1])

Or you can use this method for running only one specific motor:
amspi.run_dc_motor(amspi.DC_Motor_1)

Now the direction of the motor. How do you switch it. Easily. 
Just add False as second parameter of method:
amspi.run_dc_motors([amspi.DC_Motor_1, amspi.DC_Motor_2, amspi.DC_Motor_3, amspi.DC_Motor_4], clockwise=False)

OK, now you car is driving super fast forward but how do you stop it? Piece of cake. Just call:
amspi.stop_dc_motors([amspi.DC_Motor_1, amspi.DC_Motor_2, amspi.DC_Motor_3, amspi.DC_Motor_4])

The metod stop_dc_motors works same as run_dc_motors. 
Just specify the motors which you want to stop.
On the git repository is commented example.py file. 
You can look at it and see what it can do.

OK, that was easy, right? If you have questions just ask me. I will try to answer them. 


neděle 6. března 2016

RoboCar: Arduino Motor Shield L293D with Raspberry Pi B+ (part 1)

Target: Running 4 DC motors with Raspberry Pi B+ and Motor Driver Shield L293D for Arduino.
How to do it: I have no idea. I am lots. ... OK, do not freak out. Take a deep breath and think.

Arduino Motor Shield - How does it work?

How does the L293D module work? And why is there the 74HC595 thing? Hmm. I have to figure it out. 
With this shield you can run 4 DC motors. It is done by two L293D with help of 74HC595.

Motor Shield L293D for Arduino

L293D module - Motor controller

Let's start with the L293D. This module can control two motors. It tells the motor to run/stop and change the direction of the motor (clockwise/counterclockwise). I am lazy and I did not want to draw so I borrowed this image.

L293D Module - Connection of motors
Image source: http://www.noveldevices.co.uk/ar-project-motor-control
What do we need to spin the wheel? We should connect the motor and then we have to do two things.

1. Set the direction of the motor

This is done by setting HIGH or LOW value to PIN 2 and PIN 7 of the L293D. Direction can be set according table below.


Input 1 Input 2
LOW LOW no spin
LOW HIGH clockwise
HIGH LOW counterclockwise
HIGH HIGH no spin

Same can be applied to the second motor (circuit) on Input 3 and Input 4 (PIN 11 and PIN 15).

2. Enable the motor

Or we can say: Tell the motor to run. This is done by setting HIGH value to the PIN 1 (Enable 1,2) or PIN 9 for second motor.

74HC595 module - Serial Shift Register

Why do we need this shift register? I had no idea. But then I had a detailed  look to the shield scheme. And then I understood. It is for sawing wires. With this I can set for all motors its direction using only 3 data wires instead of 8. That's cool.

74HC595 -  Serial Shift Register
Image source: http://www.protostack.com/blog/2010/05/introduction-to-74hc595-shift-register-controlling-16-leds/

We need to connect from Raspberry Pi GPIO pins to SER (PIN 14), RCLK (PIN 12), SRCLK (PIN 11). Each output pin from the shift register (Qx) is connected to the Output PIN of L293D. (as you can see on scheme below) By passing right number to the shift register we can set the direction of each motor. Here are the combinations of number, motor and direction.

number motor direction
4 M1 clockwise
8 M1 counterclockwise
2 M2 clockwise
16 M2 counterclockwise
1 M3 clockwise
64 M3 counterclockwise
32 M4 clockwise
128 M4 counterclockwise



And from this scheme you can easily connect the Raspberry Pi GPIO to the correct pin of the motor shield (top left).

How to do it practically and how to use the python for running the motor will be described in next post.

středa 2. března 2016

RoboCar: Shopping fever

Few months ago I had an idea to build my first "robocar" using Raspberry Pi B+. I saw lot of Arduino robots but I don't wanted to use Arduino because I want my car to be "smart". So I ordered from dx.com these main items:

KEYES L293D Motor Control Shield for Arduino
ZL-4 Smart Car Chassis Kit for Arduino
Sensor Distance Measuring Module - Blue
Ultrasonic Smart Car Mounted Holder
DS18B20 Temperature Sensor - Black + Silver
PIR Motion Sensor

Then few female/female cables for connecting those things to Raspberry Pi GPIO. I already had Raspberry Pi B+ with WiFi module at home. OK, maybe you are asking why I did not bought the Motor HAT for Raspberry Pi but for Arduino. That is easy. They don't have it on dx.com and I think that it will not be so difficult to connect those modules to Raspi. But I do not have any skills in this area. I've never used Arduino or Raspi for driving motors. So wish me luck and let's go to connecting those items together. We will start with the motors ;-]

sobota 11. července 2015

BOINC: Instalace a nastavení vzdáleného přístupu

Po delší odmlce jsem si konečně našel chvíli čas a opět se zapojil do výpočtů prostřednictvím BOINC. Nastavil jsem si boinc na serveru tak, aby počítal při jeho nečinosti (což je zhruba 90% z celého dne). A jak jsem to udělal?

Server běží na distribuci Debian. BOINC je v repozitářích a tak je stačilo nainstalovat příkazem:
$ sudo aptitude install boinc-client

Určitě chci aby se mi spouštěl i po restartu počítače a toho docílím následujícím nastavením:
$ sudo update-rc.d boinc-client defaults 98

Pokud si to rozmyslím, mohu spouštění zrušit příkazem:
$ update-rc.d boinc-client remove

Nyní spustím BOINC manuálně:
$ sudo systemctl start boinc-client.service

Jestli je BOINC spuště zjistím pomocí systemctl status:
$ sudo systemctl status boinc-client.service

BOINC lze pomocí systemctl i vypnout:
$ sudo systemctl stop boinc-client.service

Pro správu projektu v konzoli existuje i textový manager:
$ sudo aptitude install boinctui



Projekt přidáme zvolením Activity - Add project, kde projekt vybereme ze seznamu. V mém připadě jsem vybral víceprojektový World Community Grid, který je pod křídly firmy IBM.


Jakmile se stáhnou všechna potřebná data výpočet může začít a jeho průběh můžete sledovat pomocí boinctui:


Pro BOINC existuje i GUI, tzv. boinc-manager, který umožnuje se vzdáleně připojit k serveru. Na to však musí být server, na kterém je BOINC spuštěn nastaven.

Pro vetší bezpečnost si nastavím heslo pomocí kterého se pak budu přihlašovat ke správě.
Heslo napíši jako text do souboru gui_rpc_auth.cfg:
$ sudo vim /var/lib/boinc-client/gui_rpc_auth.cfg

Lze jej také zadat pomocí příkazu echo:
$ echo *somepassword* > /var/lib/boinc-client/gui_rpc_auth.cfg

Poté v souboru remote_hosts.cfg nastavíme IP adresu, na které budeme naslouchat (IP adresa serveru):
$ sudo vim /var/lib/boinc-client/remote_hosts.cfg 

Poté nezapomeneme povolit vzdálené připojení:
$ sudo vim /var/lib/boinc-client/cc_config.xml 

Kde do souboru, přidáme parametr allow_remote_gui_rpc a soubor pak může vypadat následovně:
<cc_config>
  <log_flags>
    <task>1</task>
    <file_xfer>1</file_xfer>
    <sched_ops>1</sched_ops>
  </log_flags>
  <options>
        <allow_remote_gui_rpc>1</allow_remote_gui_rpc> 
  </options>
</cc_config>

Používáte-li firewall nezapoměňte povolit port 31416:
$ sudo iptables -A INPUT -p tcp --dport 31416 -j ACCEPT

Nyní je vše nastaveno a je čas na restart BOINC:
$ sudo systemctl restart boinc-client.service

Na počítači ze kterého se budeme připojovat si nainstalujeme boinc-manager. V mém případě se budu připojovat z distribuce Fedora 22, kde si boinc-manager nainstaluji z repozitářů:
$ sudo dnf install boinc-manager.x86_64

Nyní spustím boinc manager a přepnu se do advanced view (pokročilého zobrazení). Tam zvolím z menu Advanced - Select computer a zadám IP adresu serveru a heslo které jsme si zvolili:


Nyní můžeme spravovat projekty a sledovat jejich průběh vzdáleně:


Vše nám krásně beží a nyní si můžeme říct, že jsme součástí výzkumu, který pomáhá vědcům při hledání léků a výzkumu nemocí. Pokud byste měli zájem jsou zde i jiné projekty z různých oborů jako je Biologie Astrofyzika, Matematika či Multiprojektové (kam spadá i WCG). Jejich přehled můžete vidět na stránkách Czech National Team. Pokud se rozhodnete si boinc nainstalovat, připojte se také do týmu CNT. Na jejich stránkách budete mít krásný přehled vašich výpočtů spolu s porovnáním ostatních účestníku z CNT.