ロボットを作る

子供のころ、映画「STARWARS」 を観てワクワクし、ガンプラにドキドキしていた。時間が経つのも忘れてしまう、そんな時間をもう一度、取り戻すために、Raspberry pi を使って、オヤジがロボット作りに挑戦する!

やり始めてみると、なかなか思い通りに行かない。時間の経つのも忘れて悪戦苦闘中。 「こんなちっちゃな Raspberry Pi で、こんなことができるんだ」を日々実感している今日この頃。

2015年03月

「第8章 PWMの利用」の続き。



図8-11 DCモーターの速度制御用回路 を作る。
先に作ったLEDのやつをベースに若干つなぎ変えるところから始める。


 半抵抗ツマミを回す → ADコンバータ →[SPI通信]→
        【RaspPi】 →[GPIO]→ モータードライバ → DCモーター





DCモーター
事前にDCモーターに、コンデンサ(103)とワイヤーをハンダ付けしておいた。
モーターは、本のとおりのものを購入した。ラベルに

 MERCURY MOTOR
 FA-130RA 01/2014
 DC1.5V 9100RPM

と書いてある。
子供のころ買ってもらったプラモデルにお約束のように付いていた 130モータ。
それらは確か”マブチモーター”だったと思う。
同じ形状の130モータを見ると懐かしさが溢れてくる。

モータードライバ
TA7291P】
正逆転切替え用としてブリッジドライバで正転・逆転・ストップ・ブレーキの4モードがコントロールできる。 



図のとおり結線して動いた。
つまみの微妙な加減なのか、モータ回転とは別に振動する(通電する)ような音がずっとしている。「うーーーー」って唸ってる感じ。
 

第8章 PWMの利用に入る。



8章の最初にあるとおり、振り返る。
 RasPiが、デジタル出力 0/1(Low/High)の2値 【4章】
 RasPiに、デジタル入力 0/1(Low/High)の2値 【5章】
 RasPiに、アナログ入力 SPI通信:アナログ値→デジタル値変換【6章】
 RasPiに、アナログ入力 I2Cセンサ:アナログ値→デジタル値変換【7章】

この章で、PWMを用いて「擬似的な」アナログ信号を出力できることを学ぶ。



図8-6 を組んで、結果的には半抵抗のつまみを回してLEDが明るくなったり暗くなったりりしたので、うまくいった。

途中、PIN位置を間違えてまったく動かなかった。原因分からず四苦八苦した。


で、「8.4 RGBフルカラーLEDの色を変更しよう」は都合により、スキップする。
都合、半抵抗が2個足りない。買いに行くのを忘れた。orz 

【2015/3/20 19:00時点】未解決!
実は今日の半日がこれでつぶれた。。。がーーーん。基盤を壊したのだろうか。


LCDモジュール AQM0802A-RN-GBW を認識できず。

どうも LCDを認識していないようだ。
$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         



もちろんプログラムも起動しない。 
----------------------
>>> 
Traceback (most recent call last):
  File "/home/pi/Desktop/raspi-sample/07-02-LCD.py", line 70, in <module>
    setup_aqm0802a()
  File "/home/pi/Desktop/raspi-sample/07-02-LCD.py", line 17, in setup_aqm0802a
    sys.exit()
SystemExit
>>>  
----------------------


Debbugをかけてみる。

Debug Control画面で、「Step」すすむと
            bus.write_i2c_block_data(address_aqm0802a, register_setting, [0x38, 0x39, 0x14, 0x70, 0x56, 0x6c])

の行で

IOError:(5, 'Input/output error')

で黄色くなる。そらそうだ。


 


I2C接続の練習で利用したのは、

「高精度・高分解能 I2C・16bit温度センサーモジュール」 ADT7410 を使用

I2Cバスアドレスを選択できるようで、デフォルトでは 0x48。
基盤の J4,J3 をハンダ付けすることで他に3つ選べるようだが、デフォルトのまま利用した。

仕様書に
 「温度分解能(0℃を基準とした+/-符号ビットを含む)
 0.0078℃(16bit設定時)/0.0625℃(13bit設定時)」

とあって、今回プログラム内でも 13bit になっている。


プログラムのなかに

 address_adt7410 = 0x48
 register_adt7410 = 0x00

と2つの”アドレス”が出てくるが、いまいち何のために分かれているいるのか?だったが、本を読むとちゃんと書いてある。

 前者: デバイスの場所
 後者: 取得したいデータ or 保存したいデータの場所



 

「第7章 I2Cデバイスの利用」に入る。



まずハンダごてを用いて、ハンダ付けを行う。
本にハンダ付けの注意点が書かれている。慎重に慎重に行う。
がががっ、怪しい付き方になってしまった。自分の不器用さに涙する。


P.161
7.1.2 Raspberry PiでI2C通信を行うための準備

だが、 /etc/modprobe.d/raspi-*   ファイルが無い。あああああ。

落ち着け俺。書籍のホームページに更新情報が載っていた気が。
おおっ、やっぱりちゃんと載っていた。

 $ sudo raspi-config

  「8 Advanced Options」を選択 
 「A7 I2C」を選択

 $ reboot 

そして、本の P.163に戻る。

 /etc/modules へ i2c-dev を追記。
 $ sudo apt-get update
 $ sudo apt-get install i2c-tools python-smbus
 $ sudo reboot

07-01-temp.py を Run! したら。。。

あれ? エラーが
-------------------
>>> 
Traceback (most recent call last):
  File "/home/pi/Desktop/raspi-sample/07-01-temp.py", line 2, in <module>
    import smbus
ImportError: No module named smbus
>>>
------------------- 

で。ググっていたら pythonのバージョンに左右されるようだ。
起動の仕方が、

 $ sudo idle3 &

で Runさせていたので、python 3.2.3 で起動し、どうやら SMbus を python 3.x で動かすには少しテクニックが必要のようだ。
あっさり、

 $ sudo idle &
 
の python 2.7.3 で、ちゃんと動いた。
 


readadc を理解するために MCP3208 の仕様を確認しておこう。


MCP3208資料(日本語)


mcp3208_1
図5-1 MCP3204 あるいはMCP3208 との通信


・通信を開始: CS:High⇒Low    ※デバイスとの通信開始するには CSを Lowに。
・スタートビット(1bit) CS:Low + Din:High で、受取る最初のクロックは、スタートビット
・制御ビット(4bit): 
      SGL/DIFF(1bit): [1]シングルエンドモード ・・・
                  [0]差動入力モード・・・
      D0,D1,D2(3bit): 使用入力チャネル ※今回 CH0 なので [0,0,0]

・アナログ入力のサンプリング開始は、開始ビット後、4 番目クロックUP。
・サンプリング終了は、開始ビット後、5番目のクロックDOWN


ここでプログラムの以下の部分(13~15行目)をみると

 commandout = adcnum
 commandout |= 0x18
 commandout <<= 3

adcnum は、CH0 を使用するので 0 。
加えることの 0x18 = 0001 1000 でスタートビットと制御ビットになる。

3bit 右からづらすと、
1100 0000

ここまで、
0
0001 1000
1100 0000
となった。


16    for i in range(5):
17        # LSBから数えて8ビット目から4ビット目までを送信
18        if commandout & 0x80:
19            GPIO.output(mosipin, GPIO.HIGH)
20        else:
21            GPIO.output(mosipin, GPIO.LOW)
22        commandout <<= 1
23        GPIO.output(clockpin, GPIO.HIGH)
24        GPIO.output(clockpin, GPIO.LOW)


1巡目の18行目では、
     1100 000
          & 論理積
     1000 000
=   1

になる。1巡目22行目で、1bitシフトして

   1 1000 0000

になって、2巡目に

   1 1000 000
          & 論理積
   0 1000 000
=    1

で、3巡目

  11 0000 000
          & 論理積
  00 1000 000
=     0

結果的に、5巡すると、1,1,0,0,0 になる。


gacco で「物理法則プログラミング入門」が始まった。
http://gacco.org/

今週スタートしたこの講義では、JavaScript でのプログラミングを行う。
講義では、具体的にプログラムを教えてくれ、サンプルプログラムもダウンロードできるので、わかりやすい。

ただ始めてのプログラミング言語なので、感覚がまだついていけない。
これから4週間ついていけるだろうか。


本の第6章「AD変換によるアナログ値の利用」に入る。



半固定抵抗(矢印のつまみを回転すると抵抗値が変わる)を使って、アナログな値を生みだし、Analog to Digital変換して、Raspiに読ませることを行う。

ADコンバータは、本のとおり、MCP3208-CI/P を使用。初めうまくブレッドボードに刺さっていなかったので、プログラム起動後に読みとる値が 0と4095の2種類にだけなったので、奥までザクッと入れ込んだら、うまくいった。抜くときが心配だが。


本にも書いてあるが、ポイントとなるピンが4つ

MCP3208  Raspi
 CLK     SPI SCLK(11)
 Dout     SPI MISO(9)
 Din      SPI MOSI(10)
 CS/SHDN  SPI CE0(8)

で、そもそも SPI通信ってなんだ? 

Wikipediaによると。
Serial Peripheral Interface

信号線は 4本で構成され、一つのデバイスを接続する場合はSSを固定することで3本で接続できる。

 SCK --Serial Clock
 MISO --Master In Slave Out
 MOSI --Master Out Slave In
 SS --Slave Select

これらが、Raspi 上の SPI xxx とつながる。



本のとおり、

 1.プルダウン抵抗を外す。
 2.トグル動作

を行った。3. Cameraで、は費用の関係でcamera未購入のため、スキップした。

1. プルダウン抵抗を外す。

 まず、プルダウン抵抗が無いと、なにがまずいのか?が本では解説されている。
 プルダウン抵抗の必要性を理解した上で、実はこのプルダウン抵抗は、RasPi 内部にもあり、プログラムに追記することで利用できる。

2. トグル動作

 前回までは、タクトスイッチを 押している間⇔離してる間 で切り替わっていた動作を、押すごとに切り替わる動作を練習。
 

 

本の第5章「タクトスイッチによる入力」に入る。


前回までのLED点滅の部品と、新たに 10Ωの抵抗と「タクトスイッチ」、それにジャンパーワイヤを数本。

本の配線を見ながら接続するのだが、すでにややこしくなってきた。先が遠いのに。。。

前回のLED点滅は、RasPiのpythonプログラムからの「GPIO出力」、
今回のLED点灯は、タクトスイッチからの「GPIO入力」 

の理解でいいかな。




タクトスイッチを押している間にLEDが点灯した。
この写真を撮ろうと思ってフラッシュついたら、RasPiが死んだ。
最初、なんのことかわからず、配線間違ったとか、+ーが接触したのかとか心配したが、以前、Webで RasPi2 でそんな問題があることを読んだのを思い出した。

再現したら同じことが起きた。ガーーーーン。


 

↑このページのトップヘ