<Raspberry Pi-39>

「ゼロからのラズパイ奮闘記」Raspberry Pi-36で戦車制御を紹介しましたが、戦車速度の制御は
抵抗の有無(接続)をリレーで行っていました。(モーターと電池の間に抵抗を接続する、しない)

おもしろ実験室<TA7291モータドライバの調査>で紹介しましたTA7291を使えばアナログ的に
制御出来そうですので実験しました。
モーターの回転数を変えるには、モーターに供給する電圧を可変すればいいのですが
この単純な可変が中々・・・厄介です。
RaspberryのGPIOは、ON(3.3v)/OFF(0v)出力の他にPWM出力が可能ですので、TA7291の4番端子(Vref)に
このPWMを入力すれば出来そうです。
RaspberryでPWM(50Hz,周期一定)のパルス幅(HIGHとLOW)を変化させることが出来ます。
HIGHの幅が大きいと平均電圧も大きく、幅が小さいと平均電圧も小さくなる。

下記はPWMの変化とモーター回転数の様子の動画です。
画像をクリックして見てください



パルス巾が大きいと回転数が多く、パルス巾が小さいとと回転数が少なくなることが 分かったと思います。この操作は下の画像にある別PCからの操作でスライダーで回転数を可変しています。 回路図 htmlとスクリプトのプログラムです。( <は半角にして下さい) <Raspberry Pi-36>で紹介したプログラムに比べて、すっきりしています。 またファイルも少なくなっています。基本的にindex.htmlとscript.pyの2つです。 接続は、http://192.168.30:8000/です、(IPアドレスは自分の環境に合わせて下さい) index.html ------------------------------------------------------------------------------------------------------ <!DOCTYPE html> <html lang="ja"> <head> <meta charset=UTF-8"> <title>Raspberry 戦車制御</title> <script type="text/javascript" src="/webiopi.js"></script> <script> webiopi().ready( function(){ control( 0 ); //制御初期 停止ボタン Speedlevel( 5 ); //speed初期値(pwmのデューティ比)) } ); function control(mode){ webiopi().callMacro( "Controlmode", mode ); // control 0:停止 1:前進 2:後進 3:右折 4:左折 } function Speedlevel(level){ webiopi().callMacro( "Speedlevel", level); // Speed制御 } </script> </head> <body> <form> <input type="button" value="前進" onclick="control(1)" > <input type="button" value="後進" onclick="control(2)" > <input type="button" value="右折" onclick="control(3)" > <input type="button" value="左折" onclick="control(4)" > <input type="button" value="停止" onclick="control(0)" > </form> <pre> <input id="slider" type="range" min="0" max="10" step="1" value=5 onchange="showValue()" > </pre> <span id="showRangeArea" ></span> <script type="text/javascript"> function showValue () { var dc = (document.getElementById("slider").value) ; //スライダの値を変数dcに代入 Speedlevel(dc) //function Speedlevel関数を呼出してそこからマクロ関数呼出してdcを代入 //document.write(dc) //dc値を画面に表示(確認用) } </script> </body> </html> ------------------------------------------------------------------------------------------------------ script.py ------------------------------------------------------------------------------------------------------ import webiopi GPIO = webiopi.GPIO R_IN1 = 12 R_IN2 = 16 L_IN1 = 20 L_IN2 = 21 SPEED_PWM = 25 GPIO.setFunction( R_IN1 ,GPIO.OUT ) GPIO.setFunction( R_IN2, GPIO.OUT ) GPIO.setFunction( L_IN1, GPIO.OUT ) GPIO.setFunction( L_IN2, GPIO.OUT ) GPIO.setFunction( SPEED_PWM, GPIO.PWM ) def pinclear(): GPIO.pwmWrite(R_IN1, 0 ) GPIO.pwmWrite(R_IN2, 0 ) GPIO.pwmWrite(L_IN1, 0 ) GPIO.pwmWrite(L_IN2, 0 ) #onclick="drive(1)で呼び出される #<form><input type="button" value="Forward" onclick="drive(1)" data-role="none"></form> @webiopi.macro def Controlmode( mode ): if mode == "0": pinclear() elif mode == "1": pinclear() GPIO.digitalWrite(R_IN1, GPIO.HIGH ) GPIO.digitalWrite(L_IN1, GPIO.HIGH ) elif mode == "2": pinclear() GPIO.digitalWrite(R_IN2, GPIO.HIGH ) GPIO.digitalWrite(L_IN2, GPIO.HIGH ) elif mode == "3": pinclear() GPIO.digitalWrite(R_IN1, GPIO.HIGH ) GPIO.digitalWrite(L_IN2, GPIO.HIGH ) elif mode == "4": pinclear() GPIO.digitalWrite(L_IN1, GPIO.HIGH ) GPIO.digitalWrite(R_IN2, GPIO.HIGH ) @webiopi.macro def Speedlevel( level ): GPIO.pwmWrite( SPEED_PWM, int(level)/10 ) ------------------------------------------------------------------------------------------------------ 実は、タブレット(7インチ)で操作をやりたい目標があるのですが、下の画像のようにタブレットに 表示されている、ボタンとスライダーが小さく操作が困難です。決して、指が大きいのではありません(~o~) 次は、ボタン、スライダーをタブレット用に改善したいと思っています。   Raspberry Pi-40に続く・・・ Raspberry メニューに戻る