2015年12月11日金曜日

Raspberry Pi 2 より少ないサーボ制御を

前回は「Raspberry Pi 2 より多くのサーボ制御を」やったが、
今回はデフォルトの8個を減らして、他の用途に使えるGPIOを増やしたい場合。
これも簡単。前回と同様ServoBlasterのオプションを使う。

  1. --p1pins=<list>
 
 これで、サーボモータのID0にGPIO-17、ID1にGPIO-22がセットされた。 
 
 もし、デフォルトの設定からIDを変更したくない場合は、ダミーの"0"を噛ませれば良い。

2015年11月15日日曜日

Raspberry Pi 2 より多くのサーボ制御を

ServoBlasterでは、デフォルトで8個のサーボモータを制御できる。
8個の制御で事足りるんだが、もっと多くのサーボモータを使いたくなったらどうする?

安心してください。拡張できますよ。

ServoBlasterのオプションでどのピンを使うか指定することが出来る。

  1. --p1pins=<list>
 
 このオプションの<list>に使うピンのボード上の番号をカンマ区切りで書いていくだけ。
 
 
上の画像では17本のピンを指定している。
個々のピンにサーボモータを繋いでの動作確認はしているが、そんなに沢山のサーボモータを
持っていないので、同時接続での確認は出来ていない。

(2015/10/3の更新で、Raspberry Pi 2用のマップが追加されたので、フルで指定すれば
26個のサーボモータが使えるんじゃないかと思う。)

Raspberry Piで多数のサーボモータを制御する場合、サーボモータードライバ等を
別途用意しなければならないと思いがちだが、ソフトだけでもある程度の対応が
可能だというお話し。

2015年11月7日土曜日

Raspberry Pi 2 4足歩行ロボットの追加モーション

4足歩行ロボットの別モーションを作ってみた。
と言っても、ポーズを決めて順番に並べて行くだけの簡単な作業です。


予め、(移動の為に)浮かせる脚の対角線上の脚に重心が掛かるようにしておき、
その後目的の脚を浮かせるようになるので、3点支持での歩行になる筈だったが、、、。

一応、移動する脚は摺ることなく、浮いた状態で移動してるのが見えると思う。
でも、何か違うよね?!

2015年10月17日土曜日

Raspberry Pi 2 4足歩行ロボット用「簡易ポーズエディタ」

前回「Raspberry Pi 2 やっぱりシェルスクリプトでやる」で作ったServoBlaster用シェルスクリプトの発展形。


 4足歩行ロボットの脚に対応したスライダーを操作してポーズを決め、
その時点のコマンドを任意のファイルに書き出すgtkdialog使用のシェルスクリプト。

  1. #!/bin/bash
  2.  
  3. export test00='
  4. echo $USER
  5. '
  6. export SERVO0='50'
  7. export SERVO1='50'
  8. export SERVO2='50'
  9. export SERVO3='50'
  10. export SERVO4='50'
  11. export SERVO5='50'
  12. export SERVO6='50'
  13. export SERVO7='50'
  14.  
  15. export MAIN_DIALOG='
  16. <window>
  17. <vbox>
  18. <hbox>
  19. <vbox>
  20. <hbox>
  21. <frame サーボ5(%)>
  22. <vscale height-request="200" range-min="10" range-max="90" range-step="1">
  23. <default>50</default>
  24. <variable>SERVO5</variable>
  25. <action>bash -c "echo 5="$SERVO5"% > /dev/servoblaster"</action>
  26. <action type="refresh">TEXT5</action>
  27. </vscale>
  28. </frame>
  29. <frame サーボ4(%)>
  30. <vscale height-request="200" range-min="10" range-max="90" range-step="1">
  31. <default>50</default>
  32. <variable>SERVO4</variable>
  33. <action>bash -c "echo 4="$SERVO4"% > /dev/servoblaster"</action>
  34. <action type="refresh">TEXT4</action>
  35. </vscale>
  36. </frame>
  37. </hbox>
  38. <hbox>
  39. <frame サーボ7(%)>
  40. <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
  41. <default>50</default>
  42. <variable>SERVO7</variable>
  43. <action>bash -c "echo 7="$SERVO7"% > /dev/servoblaster"</action>
  44. <action type="refresh">TEXT7</action>
  45. </vscale>
  46. </frame>
  47. <frame サーボ6(%)>
  48. <vscale height-request="200" range-min="10" range-max="90" range-step="1">
  49. <default>50</default>
  50. <variable>SERVO6</variable>
  51. <action>bash -c "echo 6="$SERVO6"% > /dev/servoblaster"</action>
  52. <action type="refresh">TEXT6</action>
  53. </vscale>
  54. </frame>
  55. </hbox>
  56. </vbox>
  57.  
  58. <vbox>
  59. <hbox>
  60. <button>
  61. <label>ボタン 1</label>
  62. <action>echo $LANG</action>
  63. </button>
  64. <vbox>
  65. <button>
  66. <label>前進</label>
  67. <action>bash -c "$test00"</action>
  68. </button>
  69. <button>
  70. <label>後退</label>
  71. </button>
  72. </vbox>
  73. <button>
  74. <label>ボタン4</label>
  75. </button>
  76. </hbox>
  77. <vbox>
  78. <frame>
  79. <text>
  80. <variable>TEXT0</variable>
  81. <input>echo "echo 0="$SERVO0"% > /dev/servoblaster"</input>
  82. </text>
  83. <text>
  84. <variable>TEXT1</variable>
  85. <input>echo "echo 1="$SERVO1"% > /dev/servoblaster"</input>
  86. </text>
  87. <text>
  88. <variable>TEXT2</variable>
  89. <input>echo "echo 2="$SERVO2"% > /dev/servoblaster"</input>
  90. </text>
  91. <text>
  92. <variable>TEXT3</variable>
  93. <input>echo "echo 3="$SERVO3"% > /dev/servoblaster"</input>
  94. </text>
  95. <text>
  96. <variable>TEXT4</variable>
  97. <input>echo "echo 4="$SERVO4"% > /dev/servoblaster"</input>
  98. </text>
  99. <text>
  100. <variable>TEXT5</variable>
  101. <input>echo "echo 5="$SERVO5"% > /dev/servoblaster"</input>
  102. </text>
  103. <text>
  104. <variable>TEXT6</variable>
  105. <input>echo "echo 6="$SERVO6"% > /dev/servoblaster"</input>
  106. </text>
  107. <text>
  108. <variable>TEXT7</variable>
  109. <input>echo "echo 7="$SERVO7"% > /dev/servoblaster"</input>
  110. </text>
  111. </frame>
  112. </vbox>
  113. <entry>
  114. <variable>FILE0</variable>
  115. <default>"./temp.txt"</default>
  116. </entry>
  117. <button>
  118. <label>Write</label>
  119. <action>echo "echo 0="$SERVO0"% > /dev/servoblaster" > $FILE0</action>
  120. <action>echo "echo 1="$SERVO1"% > /dev/servoblaster" >> $FILE0</action>
  121. <action>echo "echo 2="$SERVO2"% > /dev/servoblaster" >> $FILE0</action>
  122. <action>echo "echo 3="$SERVO3"% > /dev/servoblaster" >> $FILE0</action>
  123. <action>echo "echo 4="$SERVO4"% > /dev/servoblaster" >> $FILE0</action>
  124. <action>echo "echo 5="$SERVO5"% > /dev/servoblaster" >> $FILE0</action>
  125. <action>echo "echo 6="$SERVO6"% > /dev/servoblaster" >> $FILE0</action>
  126. <action>echo "echo 7="$SERVO7"% > /dev/servoblaster" >> $FILE0</action>
  127. </button>
  128. </vbox>
  129.  
  130. <vbox>
  131. <hbox>
  132. <frame サーボ0(%)>
  133. <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
  134. <default>50</default>
  135. <variable>SERVO0</variable>
  136. <action>bash -c "echo 0="$SERVO0"% > /dev/servoblaster"</action>
  137. <action type="refresh">TEXT0</action>
  138. </vscale>
  139. </frame>
  140. <frame サーボ1(%)>
  141. <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
  142. <default>50</default>
  143. <variable>SERVO1</variable>
  144. <action>bash -c "echo 1="$SERVO1"% > /dev/servoblaster"</action>
  145. <action type="refresh">TEXT1</action>
  146. </vscale>
  147. </frame>
  148. </hbox>
  149. <hbox>
  150. <frame サーボ2(%)>
  151. <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
  152. <default>50</default>
  153. <variable>SERVO2</variable>
  154. <action>bash -c "echo 2="$SERVO2"% > /dev/servoblaster"</action>
  155. <action type="refresh">TEXT2</action>
  156. </vscale>
  157. </frame>
  158. <frame サーボ3(%)>
  159. <vscale height-request="200" range-min="10" range-max="90" range-step="1">
  160. <default>50</default>
  161. <variable>SERVO3</variable>
  162. <action>bash -c "echo 3="$SERVO3"% > /dev/servoblaster"</action>
  163. <action type="refresh">TEXT3</action>
  164. </vscale>
  165. </frame>
  166. </hbox>
  167. </vbox>
  168. </hbox>
  169. </vbox>
  170. </window>
  171. '
  172.  
  173. gtkdialog -p MAIN_DIALOG -c

というわけで、中央上部のボタンは前回同様飾り。
 使い道の無かったシェルスクリプトに、多少は意味を持たせてみた。

2015年10月12日月曜日

Raspberry Pi 2 やっぱりシェルスクリプトでやる

シェルスクリプトでもgtkdialogを使うことで、GUI操作が可能なので、
gtkdialogのスライダーを使って、サーボモータを動かしてみようと思った。
(サーボモータの制御にはServoBlasterを使用するので、そのインターフェースって感じ。)

Arch Linux ARMではリポジトリにgtkdialogがパッケージとしてあるので、
pacmanでインストールする。

例によって体裁は考えずに、兎に角動くものを作る。

  1. #!/bin/bash
  2.  
  3. export test00='
  4. echo $USER
  5. '
  6.  
  7. export MAIN_DIALOG='
  8. <window>
  9. <vbox>
  10. <hbox>
  11. <button>
  12. <label>ボタン1</label>
  13. <action>echo $LANG</action>
  14. </button>
  15. <vbox>
  16. <button>
  17. <label>前進</label>
  18. <action>bash -c "$test00"</action>
  19. </button>
  20. <button>
  21. <label>後退</label>
  22. </button>
  23. </vbox>
  24. <button>
  25. <label>ボタン4</label>
  26. </button>
  27. </hbox>
  28. <frame サーボ0(%)>
  29. <hscale range-min="10" range-max="90" range-step="1">
  30. <default>50</default>
  31. <variable>SERVO0</variable>
  32. <action>bash -c "echo 0="$SERVO0"% > /dev/servoblaster"</action>
  33. </hscale>
  34. </frame>
  35. <frame サーボ1(%)>
  36. <hscale range-min="10" range-max="90" range-step="1">
  37. <default>50</default>
  38. <variable>SERVO1</variable>
  39. <action>bash -c "echo 1="$SERVO1"% > /dev/servoblaster"</action>
  40. </hscale>
  41. </frame>
  42. <frame サーボ2(%)>
  43. <hscale range-min="10" range-max="90" range-step="1">
  44. <default>50</default>
  45. <variable>SERVO2</variable>
  46. <action>bash -c "echo 2="$SERVO2"% > /dev/servoblaster"</action>
  47. </hscale>
  48. </frame>
  49. <frame サーボ3(%)>
  50. <hscale range-min="10" range-max="90" range-step="1">
  51. <default>50</default>
  52. <variable>SERVO3</variable>
  53. <action>bash -c "echo 3="$SERVO3"% > /dev/servoblaster"</action>
  54. </hscale>
  55. </frame>
  56. <frame サーボ4(%)>
  57. <hscale range-min="10" range-max="90" range-step="1">
  58. <default>50</default>
  59. <variable>SERVO4</variable>
  60. <action>bash -c "echo 4="$SERVO4"% > /dev/servoblaster"</action>
  61. </hscale>
  62. </frame>
  63. <frame サーボ5(%)>
  64. <hscale range-min="10" range-max="90" range-step="1">
  65. <default>50</default>
  66. <variable>SERVO5</variable>
  67. <action>bash -c "echo 5="$SERVO5"% > /dev/servoblaster"</action>
  68. </hscale>
  69. </frame>
  70. <frame サーボ6(%)>
  71. <hscale range-min="10" range-max="90" range-step="1">
  72. <default>50</default>
  73. <variable>SERVO6</variable>
  74. <action>bash -c "echo 6="$SERVO6"% > /dev/servoblaster"</action>
  75. </hscale>
  76. </frame>
  77. <frame サーボ7(%)>
  78. <hscale range-min="10" range-max="90" range-step="1">
  79. <default>50</default>
  80. <variable>SERVO7</variable>
  81. <action>bash -c "echo 7="$SERVO7"% > /dev/servoblaster"</action>
  82. </hscale>
  83. </frame>
  84. </vbox>
  85. </window>
  86. '
  87.  
  88. gtkdialog -p MAIN_DIALOG -c


今のところボタンは飾りなので、気にしない。

一応、できたってだけで、使い道は無い

2015年10月4日日曜日

Raspberry Pi 2 4足歩行ロボットを作ってみよう(その4)

「先ずは、設計図を描け」ってのは言わずに 、
反省回。

1・素材選び
 加工がし易いだろうという安易な考えで、1mm厚の塩ビ板を選んだこと。
 又、部位による素材の使い分けをしなかったこと。強度を要する部位には
 それなりの素材を使用しなければならない。

2・サイズ及び重量
 Raspberry Pi 2 Model Bとブレッドボードをそのまま並列で置けるような
 大きさの本体を作ったこと。
 そもそも大きすぎ、重すぎてサーボモータSG90に負荷が掛かりすぎ。

3・ブラケット形状
 脚を水平方向に動かすサーボモータを収めるべきブラケットをL(エル)字型に
 したこと。
 脚を支える部分に当たるため、L字型ではなく、コの字型にすべき。
 (下の画像の赤線の形状)

 垂直方向に動かすサーボモータのを、水平方向サーボモータ及び本体から
 離して取り付けたこと。
 (下の画像の水色線のように取り付ける)

ブラケットを作り直したいけど、気力が無い

『次号機は無い』

2015年10月3日土曜日

Raspberry Pi 2 4足歩行ロボットを作ってみよう(その3)

さて、ロボットにRaspberry Pi 2 Model Bとブレッドボードを載せ、
サーボモータとの配線を完了する。

Raspberry Pi用の電源はスマートフォンの充電器(5V 2A)からとり、
サーボモータ用には別途用意する。
(本当は、ラズパイの電源もモバイルバッテリー等からとりたいけど、それまで
載せたら、脚が崩壊する)
当初単3電池4本でやってみたが、重過ぎで、ブラケット部の歪みが激しい。
そこで、単4電池にしてみたところ、何とか姿勢を維持できるようになった。



サーボモータを制御する為のシェルスクリプトを適当に作る。
兎にも角にも、動かしたいので、スクリプトの体裁は考えない。

  1. #!/bin/bash
  2.  
  3. hservo=(0 2 4 6)
  4. vservo=(1 3 5 7)
  5.  
  6. function home(){
  7. for i in ${hservo[@]};do
  8. echo $i=50% > /dev/servoblaster
  9. done
  10. echo 0=55% > /dev/servoblaster
  11. echo 4=45% > /dev/servoblaster
  12. for i in ${vservo[@]};do
  13. echo $i=50% > /dev/servoblaster
  14. done
  15.  
  16. echo 7=45% > /dev/servoblaster
  17. }
  18.  
  19. function star(){
  20. echo 0=65% > /dev/servoblaster
  21. echo 2=40% > /dev/servoblaster
  22. echo 4=35% > /dev/servoblaster
  23. echo 6=60% > /dev/servoblaster
  24. sleep 0.1
  25.  
  26. echo 1=30% > /dev/servoblaster
  27. echo 3=70% > /dev/servoblaster
  28. echo 5=70% > /dev/servoblaster
  29. echo 7=30% > /dev/servoblaster
  30.  
  31. sleep 0.5
  32.  
  33. echo 1=70% > /dev/servoblaster
  34. echo 3=30% > /dev/servoblaster
  35. echo 5=30% > /dev/servoblaster
  36. echo 7=70% > /dev/servoblaster
  37.  
  38. sleep 0.5
  39.  
  40. echo 1=30% > /dev/servoblaster
  41. echo 3=70% > /dev/servoblaster
  42. echo 5=70% > /dev/servoblaster
  43. echo 7=30% > /dev/servoblaster
  44. }
  45.  
  46. function first(){
  47. echo 1=70% > /dev/servoblaster
  48. echo 7=60% > /dev/servoblaster
  49.  
  50. sleep 0.2
  51.  
  52. echo 0=65% > /dev/servoblaster
  53. echo 6=40% > /dev/servoblaster
  54. echo 2=40% > /dev/servoblaster
  55. echo 4=55% > /dev/servoblaster
  56.  
  57. sleep 0.1
  58.  
  59. echo 1=30% > /dev/servoblaster
  60. echo 7=30% > /dev/servoblaster
  61. }
  62.  
  63. function second(){
  64. echo 5=30% > /dev/servoblaster
  65. echo 3=30% > /dev/servoblaster
  66.  
  67. sleep 0.2
  68.  
  69. echo 2=60% > /dev/servoblaster
  70. echo 4=35% > /dev/servoblaster
  71. echo 0=45% > /dev/servoblaster
  72. echo 6=60% > /dev/servoblaster
  73.  
  74. sleep 0.1
  75.  
  76. echo 5=70% > /dev/servoblaster
  77. echo 3=70% > /dev/servoblaster
  78. }
  79.  
  80. home
  81. sleep 0.5
  82. star
  83. sleep 0.5
  84.  
  85. for((i = 0; i < 5; i++));do
  86. first
  87. sleep 0.5
  88. second
  89. sleep 0.5
  90. done
  91.  
  92. sleep 1
  93. star

じゃあ、動かしてみよう。
デスクトップPCからSSHでRaspberry Piへログインし、先ずはsudoでServoBlasterを起動。
シェルスクリプトを動かす。


まあ、真っ直ぐ進まないのはご愛嬌。
何せ手作り故、脚部の加工精度なんて出てない。多少は補正を入れてあるけど、適当なので。

それでも、初めて自作したロボットが前進したので大満足!!

今後は、それっぽいモーションを少しずつ作って行きたい。

2015年9月26日土曜日

Raspberry Pi 2 4足歩行ロボットを作ってみよう(その2)

ロボット製作は疎か、電子工作すらやったことのない文系なので、
ゼロからの出発は無理。
参考になるサイトを探し回った結果、以下のページを参考にした。

http://www.robotshop.com/letsmakerobots/project-sc-qr-1-with-more-videos
http://robotshop.com/letsmakerobots/arduino-quadruped-walking-robot
http://www.robotshop.com/letsmakerobots/chopstick-junior-10
(『参考にした』と言ったら、先方に失礼なんですが、、、。)

動画を何度も見て、頭の中でイメージを固めていく。
で、図面など描ける筈もないので、簡単なスケッチを書く。

上のスケッチから、ダンボールや厚紙で、具体的な形にしてみる。
右の白いのは、平行リンクっぽい足の動きを確かめるための物で、大きく作ってある。

SG90をブラケットにはめ込んでみた。

何となく、具体的なイメージが掴めたら、用意した『硬質塩ビ板』で作る。
用意した塩ビ板が(事もあろうに)1mm厚だったため、実際にサーボモータや
脚を取り付けてみると、胴体がペランペランで歪んでしまった。
今更、素材を変更して作り直す気力はなかったので、、、。
補強用の桟を取り付け、ブラケットも強度が必要な部分は2枚重ねにした。
これで、Raspberry Pi 2とブレッドボードを載せても、何とか支えることができる
ようにになった。

後は、いよいよ配線してServoBlasterでマイクロサーボSG90を制御するための
シェルスクリプトを動かすことになる。

果たして、この自作4足歩行ロボット(もどき)は動くのだろうか?

2015年9月23日水曜日

Raspberry Pi 2 4足歩行ロボットを作ってみよう(その1)

ロボットと言えば多脚。

(いろんな意味で)入手できるサーボモータは、
デジタル・マイクロサーボ SG90の10個セットなので、
これで、できそうな範囲を考える。

サーボモータ10個以内だと、2自由度の4脚(Quadruped Robot)って選択肢になる。
ネットで4足歩行ロボットの情報を漁りつつ、Raspberry PiのGPIOでサーボモータを
制御する方法を調べる。

サーボモータの制御は、GPIOからPWM(パルス幅変調)信号をモータ側へ
与えることで回転角度を調節する仕組みらしい。
信号のパルス幅を変える(変調する)ことで、角度も変わる。
Raspberry Pi 2 Model Bの場合、ハード的に精度の高いPWMを扱えるのは、GPIOの
18番と19番(あるいは12番と13番)の二つになるので、これでは最低8個の
サーボモータを動かすには足りない。

ハード(PCA9685搭載のサーボドライバー) を追加する手もあるが、そこまで
したくはない。
ソフトで擬似的にPWM制御が出きるようなのでそれを試す。

すぐ見つかったのは、WiringPiと言う、C言語でGPIOを制御する為のライブラリと、
デバイスファイルに値を書き込むことでサーボモータを制御するServoBlaster。

WiringPi
WiringPiはC/C++以外にもPythonやPHP用のラッパーを使えば、それらでの使用が可能。
WiringPiはpacmanでArch Linux ARM のリポジトリからインストール可能。
コンパイルとか面倒なことはしたくないので、Pythonで試してみる。

Arch Linux ARMではPython3が標準なので WiringPi2-Python(ラッパー)を
インストールして、 import wiringpi2として呼び出す。
※追記2(2016/05/15 13:35)※
ラッパーのインストール事情が変わったようなので、こちらを参照

インストールはgitで
  1. git clone https://github.com/Gadgetoid/WiringPi2-Python.git
  2. cd WiringPi2-Python
  3. sudo python setup.py install
  4. sudo python3 setup.py install
サンプル:
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. import wiringpi2 as wiringpi
  5. from time import sleep
  6.  
  7. wiringpi.wiringPiSetupGpio()
  8.  
  9. def movleft(pin):
  10. wiringpi.softPwmCreate(pin,0,200)
  11. sleep(0.5)
  12. wiringpi.softPwmWrite(pin,20)
  13.  
  14. def movright(pin):
  15. wiringpi.softPwmCreate(pin,0,200)
  16. sleep(0.5)
  17. wiringpi.softPwmWrite(pin,10)
  18.  
  19. def movmiddle(pin):
  20. wiringpi.softPwmCreate(pin,0,200)
  21. sleep(0.5)
  22. wiringpi.softPwmWrite(pin,15)
  23.  
  24. movleft(17)
  25. movright(17)
  26. movleft(17)
  27. movmiddle(17)

  1. wiringpi.softPwmCreate(pin,0,200)
softPwmCreateの第1引数でGPIO番号を指定し、第2引数でPWM初期値(取り敢えず"0"にしとく)、
第3引数で200を指定して、サーボモータの周期に合わせて20msにする。
wiringpi.softPwmWrite(pin,20)
後は、softPwmWriteで指定したGPIO番号にいくつのカウンタを送るかを指定する。
1カウンタは0.1msに固定されているので、20を引数にすれば2.0ms幅の信号が送られる。
(※上のサンプルは、都度softPwmCreateを実行してますが、1回設定すれば良いので、
 これは悪い例です。マネしないでください※)

あのー、Pythonってインデントで構文ブロックを判断するんですか?
慣れないと変な間違いをしそう。
一応、動きましたけどね。

ServoBlaster
 さてServoBlaster、これはちと古いのでそのままではRaspberry Pi 2 Model B
に対応していない。
対応版のこちら ServoBlaster-20150219.tgz を使う。
ただし、kernelのバージョンが4.1以上の場合は、コードの修正が必要。
ServoBlaster-20150219.tgzを解凍した中の、servod.c をエディタで開き、
1281行目

  1. if (mknod(MBFILE, S_IFCHR|0600, makedev(100, 0)) < 0)

makedev(100,0) を makedev(249,0) に書き換えたうえで、
"cd ServoBlaster", "make", "sudo ./servod"を実行。

こんな表示が出ればOK。

使い方は簡単で、

  1. echo 0=50% > /dev/servoblaster

のように、ServoBlasterでの番号にどの程度動かすかを指定して、
/dev/servoblasterに書き込むだけ。
パーセンテージ指定の他に、パルス幅の指定や、相対的な増減量指定もできる。
(自分は%指定しか使わないので、他の方法を詳しく知りたい場合は検索してくださ い)
これなら、シェルスクリプトで手軽に使えるね!

さあ、基幹となるサーボモータの制御ができたら、いよいよロボットの作成に移る。

※追記1(2015/11/15 10:45)※
 文中では、ServoBlaster-20150219.tgzを使用していましたが、
 2015/10/3にServoBlasterが更新され、Raspberry Pi 2 、kernel4.1(以降)に対応しています。
https://github.com/richardghirst/PiBits/tree/master/ServoBlaster
更新版を使っての動作確認が出来ました。

 ※追記3(2017/04/29 21:30)※
"servod: Cannot parse the hardware name string"
kernel4.9系で、上のエラーが出る場合、こちらに対処方法があります

2015年9月21日月曜日

Raspberry Pi 2 4足歩行ロボットを作ってみよう(その0)

Raspberry Pi 2  Model B を買っちまった。

最初はNOOBSを使ってRaspbianをインストールした。
 簡単だった。

で、、、?

やっぱり、Arch Linuxを入れたいじゃないですか。
先ずは、現在使用中のPCでの作業。

1  ARM用のArchLinuxARM-rpi-2-latest.tar.gzをダウンロードしてroot権限で解凍
2  ラズパイ用のmicroSDカードをフォーマット(例によってGpartedを使う)
パーティションは二つに分ける
boot用にFAT32で100M、それ以外をext4でフォーマット
3  先に解凍してできたディレクトリからbootディレクトリの『中身』
microSDカードのFAT32領域にコピペ
(※bootディレクトリのコピペではない!!※ )
その他はディレクトリごとext4領域へコピペ
  4 出来上がったmicroSDをRaspberry Piへ挿して、電源を繋ぐ

(上記方法で上手く行かなければ、こちらのとおりに実行する)



後は、Arch Linuxの諸々の設定をする『だけ』。
無線LANを使いたい場合は、予めwirelwsstools、wpa_supplicant、dialog、
そしてlibnlのパッケージを別途ダウンロードしてmicroSDへ入れておき、
Raspberry Piでの起動後にpacman -U でインストールする。
wifi-menuを使って無線LANの設定をする。
(※もし"Calling CRDA to update world regulatory domain" って出たら、
 wireless-regdbとcrdaパッケージを入れ、 /etc/conf.d/wireless-regdomの
 WIRELESS_REGDOM="JP" と書かれた行をアンコメントして再起動※)

一通りLチカの実験等をしながら、思った。

「次はサーボモータの制御実験かな。
ん?どうせなら、ロボット作ってみようぜ」ってね、、、。
(済みません。上の台詞はフィクションです。
実際は、DCモータをモータードライバで制御して、車輪かキャタピラの
自走ロボットを作り、Webカメラを搭載して動くピーピングトムにしようと
思ったんです。でも、そろえなきゃならない物が意外と多そうなので、
止めました。)



2015年5月10日日曜日

Arch Linux オフラインで、、、と思ったら!(罠

USBの無線LAN子機WN-G150UMKが、kernelのアップグレードで使えなくなった。
(3.16.4-1から4.0.1-1)

それまでも、WN-G150UMKはkernel組み込みのドライバでは使用できず、
AURの8192cu-dkmsを使ってネットワーク接続していた。
その時は他の子機CG-WLUSB300NWで接続しておきながら、

yaourt -S 8192cu-dkms

として、現行kernel(3.16.4.-1)用のモジュールを生成した。

今回のアップグレードでも、新kernel(4.0.1-1)用のモジュールを生成すれば問題の子機も
使えるようになるのでは、と考えた。

ところが、CG-WLUSB300NWも4.0.1-1では使えなくなってしまった。
面白いですな。どうしましょうか、、、。
(勿論、有線にすれば良いのだろうが、ルータとは1階・2階で離れているので
 それを有線でつなぐのも芸がない)

何のことはない、yaourtを使わずにオフラインでmakepkgすればよい。

先ず、kernelを3.16.1-4へダウングレードする。
LANが使える状態にして、https://aur.archlinux.org/packages/8192cu-dkmsから
tarballをダウンロードして解凍しておく。
さらに、「パッケージの詳細」頁の「ソース」に記述にあるとおり
8192cu-v4.0.2_9000.tar.gzが必要なのでこちらもダウンロードしておく。(解凍はしない)
任意のフォルダに置いておけば良いのだが、わかりやすい様に、先に解凍した
8192cu-dkmsの他のソースと同じ場所(PKGBUILDがある所ね)に置く。
更に、解凍した中の .SRCINFO 17行目を以下の様に書き換える

source = 8192cu-v4.0.2_9000.tar.gz

これで、オフラインでもダウンロード済みの8192cu-v4.0.2_9000.tar.gzを
使って作業を進めることができる。

後は、kernelをアップグレード+再起動してからPKGBUILDがあるフォルダに移動して、
makepkgを実行する。
起動中のkernelとlinux-headersでkernelに合ったモジュールが出来上がるはず。
(と理解しているんですが、本当のところは良く分かりません。済みません)

できあがったパッケージ(8192cu-dkms-v4.0.2_9000-8-any.pkg.tar.xz)は、
# pacman -U でインストール。

何はともあれ、これで使えているので、結果OK(って本当かよ!)

やっぱり、罠でした。

実は、dkmsサービスを起動していなかったので、パッケージを手動で入れ直して
いた訳です。

# systemctl enable dkms.service

としておけば、dkmsモジュールが自動でリビルドされるらしいです!
ってか、それがDKMSの本来の姿だって。
dkmsサービスを有効にしておいて、kernelのダウングレード、アップグレードを
やってみました。パッケージを手動で入れ直すことなく上手く動いてます。
(但し、8192cu-dkmsのパッケージ自体がkernel 4.0以降に対応したバージョン
 でインストールしているという条件なので、8192cu-dkmsのパッケージが古い
 バージョンだった場合は、パッケージのアップグレードが必要な筈です)

※追記(2015/05/11 20:30)※
 /var/lib/dkms/8192cu 以下にkernelのバージョンごとにモジュールが作られて
いるのを確認しました。

2015年5月9日土曜日

Arch Linux ttf-rictyの全角スペース非可視化

フォントにRictyを入れたが、全角スペースが可視化されていて、
逆に鬱陶しかった。

(「ててる」、って何だよ。直そうと思ったけど、再インストールが面倒なのでそのまま)

そこで、全角スペースを非可視化した。

yaourt -S tty-ricty を実行すると、



と出るので、y を選択して編集する。

  ./ricty_generator.sh /usr/share/fonts/{OTF/Inconsolata.otf,TTF/migu-1m-regular.ttf,TTF/migu-1m-bold.ttf}

この行の ricty_generator.sh に「全角スペースを可視化しない。」オプション
-z を追加↓。

  ./ricty_generator.sh -z /usr/share/fonts/{OTF/Inconsolata.otf,TTF/migu-1m-regular.ttf,TTF/migu-1m-bold.ttf}

そうすると、『Option: Disable visible zenkaku space』として生成される↓

あとは、そのまま普通にパッケージの作成→インストールと進んで終了。

2015年2月21日土曜日

Arch Linux 個人設定用メモ

こっから先は、(統合)デスクトップ環境をインストールしても良し。
ディスプレイマネージャ、ウィンドウマネージャ、ファイルマネージャ等
各種マネージャ類を単独に組み合わせてインストールするも良し。
日本語入力も、好きなインプットメソッドを使えば良し。
アプリケーションに至っては、、、。

なので、個々のパッケージのインストールや設定を書いておいても、あまり意味がない
かもしれない。

それでも、書いておきたい自分用メモ。

①前回やり残しているユーザ別ロケール設定
~/.xinitrc 内で
export LANG=ja_JP.UTF-8
と記述する。

②日本語入力のインプットメソッドを使うための設定

    export GTK_IM_MODULE='uim'
    export QT_IM_MODULE='uim'
    uim-xim &
    export XMODIFIERS='@im=uim'

↑のような環境変数の設定を何処に書くか?
「~/.xprofile、~/.xinitrc、~/.xsession などに設定します」
「など」と言われても解らんし。

自分の少ない経験では、~/.xprofile を読み込むディスプレイマネージャ
(例えば、LXDM)を使っているなら ~/.xprofile に、
そうでなければ、~/.xinitrc に書く
(DMの中には~/.xsessionを読み込むものがあるらしい。XDMとか?
 その場合は、~/.xsession に書き込む ←未検証

③マウスカーソルテーマの変更
~/.icons フォルダを作成。
更にその下に、default フォルダ作成(~/.icons/default)。

GNOME-Look.org あたりから、適当なテーマを落として、
~/.icons に(解凍して)入れる。
大概テーマのフォルダ内に index.theme があるので、それを
~/.icons/default に入れる。
index.theme をエディタで開いて、
name=xxxx とあるのを、Inherits=xxxx に書き換える。

この Inherits の書き換えをすれば、Xの再起動などしなくても、
カーソールテーマの変更が反映される。

④壁紙の表示
feh の使用 ⇒ Fluxboxのテーマを設定してる場合は、
Fluxboxのテーマ自体がbackgroundを持っているので、それを
コメントアウトしとく。と言っても、起動させる順番を変えれば
良いだけかもしれないけど、、、。
(Fluxboxパッケージのアップデートがあるとテーマも上書き
 されちゃうので、ファイル名変更しとくのも手かも)

2015年2月6日金曜日

Arch Linux デスクトップを整えるその前に

Xでのデスクトップ環境を整えていく前準備

①KEYMAPの設定
先ずはコンソール上の設定。
# nano /etc/vconsole.conf

KEYMAP=jp106
(上記記述後保存)

続いて、X上の設定
# nano /etc/X11/xorg.conf.d/10-keyboard.conf

Section "InputClass"
    Identifier         "Keyboard Defaults"
    MatchIsKeyboard    "yes"
    Option             "XkbModel" "jp106"
    Option             "XkbLayout" "jp"
EndSection
(上記記述後保存)

※特記事項※
上の2つのファイルは既存では無いので、ここで新規作成に
なると思う。

②タイムゾーンの設定
ここでは、ハードウェアクロックをUTCとして認識させ、
タイムゾーンを設定することによって、日本時間(UTC+9時間)
を使うようにする。
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# hwclock --systohc --utc

# nano /etc/adjtime で確認。

(これで時間が9時間進んでしまう場合は、
 # timedatectl set-time "2015-02-06 10:17:16"
 上記のような形式で、日本時間より9時間前の時刻に設定する)

※特記事項※
# hwclock --systohc --utc の実行によって、/etc/adjtime ファイルが
自動的に作成される。
ハードウェアクロックをUTCとして認識するか、ローカルタイムとして認識するかは、
ハード的に保持されていないので、このファイルを使って読み取る(らしい)。
(Windowsとのデュアルブート等の理由でローカルタイムにしたいときは、
 # hwclock --hctosys --localtime にして、タイムゾーンをUTC+0時間地域に
 設定する手(??)も考えられるけど、ここは素直にUTCとして認識させる)

③ロケール設定
# nano /etc/locale.gen

en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8
↑の行頭 # を削除してアンコメント後保存。

# locale-gen

※特記事項※
/etc/locale.conf で環境変数に LANG=ja_JP.UTF-8 を指定するのが一般的
なのかもしれないが、システム全体ではなくユーザ毎に設定したい。
なので、/etc/locale.conf は編集しない。

ユーザ毎の設定は、~/.xinitrc 内で
export LANG=ja_JP.UTF-8
と記述する。
ユーザ毎の設定を、~/.bashrc に記述する方法を紹介しているところもあるけど、
ログイン直後のコンソールで日本語指定するのはどうなんだろう。
ってことで、X上で反映させるように ~/.xinitrc の方でやる。
(ユーザを追加していないので、まだやらないけど!)
(尤も、日本語指定しない選択肢も十分考えられる)

④ユーザの追加
# useradd -m -g users -G wheel -s /bin/bash 〈ユーザ名〉
# passwd 〈ユーザ名〉

⑤sudoers の編集
useradd のときに、wheelグループにしているので、このグループで
sudo を使えるようにする。
(面倒くさいので、visudo は使わない。絶対に真似しないでね!!)

# nano /etc/sudoers

%wheel ALL=(ALL) ALL
↑の行頭 # を削除してアンコメント後保存。

rebootして、追加したユーザでログインし直す。