2015年10月17日土曜日

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

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


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

#!/bin/bash

export test00='
echo $USER
'
export SERVO0='50'
export SERVO1='50'
export SERVO2='50'
export SERVO3='50'
export SERVO4='50'
export SERVO5='50'
export SERVO6='50'
export SERVO7='50'

export MAIN_DIALOG='
  <window>
    <vbox>
      <hbox>
        <vbox>
          <hbox>
            <frame サーボ5(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO5</variable>
                <action>bash -c "echo 5="$SERVO5"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT5</action>
              </vscale>
            </frame>
            <frame サーボ4(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO4</variable>
                <action>bash -c "echo 4="$SERVO4"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT4</action>
              </vscale>
            </frame>
          </hbox>
          <hbox>
            <frame サーボ7(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO7</variable>
                <action>bash -c "echo 7="$SERVO7"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT7</action>
              </vscale>
            </frame>
            <frame サーボ6(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO6</variable>
                <action>bash -c "echo 6="$SERVO6"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT6</action>
              </vscale>
            </frame>
          </hbox>
        </vbox>

        <vbox>
          <hbox>
            <button>
              <label>ボタン 1</label>
              <action>echo $LANG</action>
            </button>
            <vbox>
              <button>
                <label>前進</label>
                <action>bash -c "$test00"</action>
              </button>
              <button>
                <label>後退</label>
              </button>
            </vbox>
            <button>
              <label>ボタン4</label>
            </button>
          </hbox>
          <vbox>
            <frame>
              <text>
                <variable>TEXT0</variable>
                <input>echo "echo 0="$SERVO0"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT1</variable>
                <input>echo "echo 1="$SERVO1"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT2</variable>
                <input>echo "echo 2="$SERVO2"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT3</variable>
                <input>echo "echo 3="$SERVO3"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT4</variable>
               <input>echo "echo 4="$SERVO4"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT5</variable>
                <input>echo "echo 5="$SERVO5"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT6</variable>
                <input>echo "echo 6="$SERVO6"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT7</variable>
                <input>echo "echo 7="$SERVO7"% > /dev/servoblaster"</input>
              </text>
            </frame>
          </vbox>
          <entry>
            <variable>FILE0</variable>
            <default>"./temp.txt"</default>
          </entry>
          <button>
            <label>Write</label>
            <action>echo "echo 0="$SERVO0"% > /dev/servoblaster" > $FILE0</action>
            <action>echo "echo 1="$SERVO1"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 2="$SERVO2"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 3="$SERVO3"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 4="$SERVO4"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 5="$SERVO5"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 6="$SERVO6"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 7="$SERVO7"% > /dev/servoblaster" >> $FILE0</action>
          </button>
        </vbox>

        <vbox>
          <hbox>
            <frame サーボ0(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO0</variable>
                <action>bash -c "echo 0="$SERVO0"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT0</action>
              </vscale>
            </frame>
            <frame サーボ1(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO1</variable>
                <action>bash -c "echo 1="$SERVO1"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT1</action>
              </vscale>
            </frame>
          </hbox>
          <hbox>
            <frame サーボ2(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO2</variable>
                <action>bash -c "echo 2="$SERVO2"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT2</action>
              </vscale>
            </frame>
            <frame サーボ3(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO3</variable>
                <action>bash -c "echo 3="$SERVO3"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT3</action>
              </vscale>
            </frame>
          </hbox>
        </vbox>
      </hbox>
    </vbox>
  </window>
'

gtkdialog -p MAIN_DIALOG -c 

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

2015年10月12日月曜日

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

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

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

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

#!/bin/bash

export test00='
echo $USER
'

export MAIN_DIALOG='
  <window>
    <vbox>
      <hbox>
        <button>
          <label>ボタン1</label>
          <action>echo $LANG</action>
        </button>
        <vbox>
          <button>
            <label>前進</label>
            <action>bash -c "$test00"</action>
          </button>
          <button>
            <label>後退</label>
          </button>
        </vbox>
        <button>
          <label>ボタン4</label>
        </button>
      </hbox>
      <frame サーボ0(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO0</variable>
          <action>bash -c "echo 0="$SERVO0"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ1(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO1</variable>
          <action>bash -c "echo 1="$SERVO1"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ2(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO2</variable>
          <action>bash -c "echo 2="$SERVO2"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ3(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO3</variable>
          <action>bash -c "echo 3="$SERVO3"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ4(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO4</variable>
          <action>bash -c "echo 4="$SERVO4"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ5(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO5</variable>
          <action>bash -c "echo 5="$SERVO5"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ6(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO6</variable>
          <action>bash -c "echo 6="$SERVO6"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ7(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO7</variable>
          <action>bash -c "echo 7="$SERVO7"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
    </vbox>
 </window>
'

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電池にしてみたところ、何とか姿勢を維持できるようになった。



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

#!/bin/bash

hservo=(0 2 4 6)
vservo=(1 3 5 7)

function home(){
    for i in ${hservo[@]};do
        echo $i=50% > /dev/servoblaster
    done
    
    echo 0=55% > /dev/servoblaster
    echo 4=45% > /dev/servoblaster
    
    for i in ${vservo[@]};do
        echo $i=50% > /dev/servoblaster
    done

    echo 7=45% > /dev/servoblaster
}

function star(){
    echo 0=65% > /dev/servoblaster
    echo 2=40% > /dev/servoblaster
    echo 4=35% > /dev/servoblaster
    echo 6=60% > /dev/servoblaster
    
    sleep 0.1

    echo 1=30% > /dev/servoblaster
    echo 3=70% > /dev/servoblaster
    echo 5=70% > /dev/servoblaster
    echo 7=30% > /dev/servoblaster

    sleep 0.5

    echo 1=70% > /dev/servoblaster
    echo 3=30% > /dev/servoblaster
    echo 5=30% > /dev/servoblaster
    echo 7=70% > /dev/servoblaster

    sleep 0.5

    echo 1=30% > /dev/servoblaster
    echo 3=70% > /dev/servoblaster
    echo 5=70% > /dev/servoblaster
    echo 7=30% > /dev/servoblaster
}

function first(){
    echo 1=70% > /dev/servoblaster
    echo 7=60% > /dev/servoblaster

    sleep 0.2

    echo 0=65% > /dev/servoblaster
    echo 6=40% > /dev/servoblaster
    
    echo 2=40% > /dev/servoblaster
    echo 4=55% > /dev/servoblaster

    sleep 0.1

    echo 1=30% > /dev/servoblaster
    echo 7=30% > /dev/servoblaster
} 

function second(){
    echo 5=30% > /dev/servoblaster
    echo 3=30% > /dev/servoblaster

    sleep 0.2

    echo 2=60% > /dev/servoblaster
    echo 4=35% > /dev/servoblaster
    
    echo 0=45% > /dev/servoblaster
    echo 6=60% > /dev/servoblaster

    sleep 0.1

    echo 5=70% > /dev/servoblaster
    echo 3=70% > /dev/servoblaster
} 

home
sleep 0.5
star
sleep 0.5

for((i = 0; i < 5; i++));do
    first
    sleep 0.5
    second
    sleep 0.5
done

sleep 1
star

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


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

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

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