Vol.752 17.Aug.2018

常時通電USBバッテリー javascriptのおさらい ラズパイ(16)〜DCモーター制御

B 常時通電USBバッテリー

by fjk

ラズパイ等でUSBバッテリーを利用していると、電源投入後しばらくすると電源が切れてしまうことがある。これは給電電流が小さく、デバイスが繋がっていないか、又は充電が完了したとバッテリーが判断するためです。確かに充電が終了しているのも関わらず電流を流し続けるのは、過充電を避けるために必要な方式ですが、小電力のラズパイ等で電源供給用として使うには不都合です。
 そこで、電源が切れないバッテリを探してみると、IoT機器対応バッテリーのCHE-061(cheero Canvas 3200mAh IoT、2.1A、\2,500)があった。CHE-061のプッシュスイッチは軽く押すだけでon/off動作するので触らないよう注意が必要。
 バッテリーの遮断電流値を、「USBテスター」(abc714参照)と「USB負荷」(USB放熱器・リフレッシャー、\1,400)で、既に持っているバッテリーがどれくらいの電流値で遮断されるか測定した。

<遮断電流の測定>
メーカー品 名容 量出 力遮断電流
USBテスター+負荷
cheeroCHE-061 32001A 停止無し
Sony CP-E87C 87001.5Ax2停止無し
ElecomDE-Mo1L 70002+2.4A0.1A
ElecomDE-M04L 32002.1A 0.1A
BeatitB-01 108002.1A 0.1A

 その結果、前述のcherroの他sony製品(スイッチは無くUSBを差し込むだけで電源がONとなる)でも自動停止せずに出力が可能であったが、通常は出力電流値が概ね0.1Aより小さくなれば、USB出力が遮断されるようである。そこで、USB出力に遮断電流値以上を常時流し続ければ電流が遮断されないので、0.1A程度が流せる負荷(LEDライトなど)をUSBハブを使って、使用したい機器と並列に接続したところ、電源が切断されること無く、USB(5v)が遮断されずに常時出力させることができた。LEDライトは結構明るく熱くなるので小電力LEDライトを複数使う方が良いかも。

負荷用小型LEDライト
(組合せ使用がお勧め)
左から0.2W、0.5W、1W
小電力小型USBライト3個を
平行負荷用として接続


J javascriptのおさらい

by fjk

 webでよく使われるHTMLファイルはその利用中には中身の変更が出来ません。しかし、クライアントの要求に従ってwebの表示内容を動的に変更したいことがあります。これをwebサーバー上で動作させるのがCommonGatewayInterfaseで、php等が使われます。これに対してwebブラウザ上で処理を実行するのがクライアントサイドスクリプトと呼ばれ、主にjavascriptが用いられています。後者は基本的に通信が必要なく、例えば地図で表示位置を変える場合(googleのAjax)など、サーバーとの接続が無くても実行できます。

Javascriptの記述と実行は以下の3種類の方法がある。

1.htmlファイルにプログラムを埋め込む方法
@bodyパート:  実行結果を表示したい時
A属性に記述: イベントハンドラから呼び出す時
Bheadパート: 呼び出される関数を記述

2.javascriptファイル(拡張子はjs)を作成して読み込む方法
スクリプトを読み込みたいところで、以下を記述

3.関数の定義と呼出
無名関数を使うと関数自体を引数として別の関数に渡すことが出来る。
function callback(func){ func(); }
callback( function(){ alert( "Hellow" ); } );

function func(){
  alert("Hellow");
}
func()
 
var func = function(){
  alert("Hellow");
};               ・・・セミコロンが必要
func();
一般的な関数   関数名が無い無名関数

4.主なオブジェクト
@windows <使用例>
  ・ウィンドウを新規に開く mywin = windows.open("http://www.google.co.jp/");
  ・ウィンドウを閉じる mywin.close();
  ・警告ダイヤログを表示 alert();
  ・確認ダイヤログを表示 confirm();
  ・入力ダイヤログを表示 prompt();
Adocument <使用例>
  ・新ドキュメントの開始 document.open();
  ・ドキュメントの終了 document.close();
  ・文字列を書き出す document.write("<p>ドメインは、" , document.domain , "</p>");
  ・文字列を書き出し改行 document.writln("<p>タイトルは、" , document.title , "</p>");
Bform <使用例>
  ・1行テキスト <input type="text" name="名前" value="初期値">
  ・複数行テキスト <textarea name="名前" rows="行数" cols="幅"> "初期値" </textarea>
  ・パスワード <input type="password" name="名前">
  ・隠しフィールド <input type="hidden" name="名前" value="値">
  ・ラジオボタン <input type="radio" name="名前" value="値" cheked>テキスト
  ・チェックボックス <input type="checkbox" name="名前" value="値" cheked>テキスト
  ・ドロップダウン式 <select name="名前">
   メニュー  <option value="値" selected>テキスト</option>
     <option value="値">テキスト</option>
         ・・・
     </select>
  ・リストボックス <select size="行数" name="名前">
    <option value="値" selected>テキスト</option>
    <option value="値">テキスト</option>
        ・・・
   </select>
  ・アップロード <input type="file" name"名前">
  ・送信ボタン <input type="submit" name="名前" value="値">
  ・リセットボタン <input type="reset" name="名前" value="値">

5.イベント(event)ハンドラ
onBlur ページやフォーム要素からフォーカスが外れた時に発生
onFocus ページやフォーム要素にフォーカスが当たった時に発生
onChange フォーム要素の選択、入力内容が変更された時に発生
onSelect テキストが選択された時に発生
onSelectStart ページ内の要素が選択されようとした時に発生 ※IEのみ
onSubmit フォームを送信しようとした時に発生
onReset フォームがリセットされた時に発生
onAbort 画像の読み込みを中断した時に発生
onError 画像の読み込み中にエラーが発生した時に発生
onLoad ページや画像の読み込みが完了した時に発生
onUnload ウィンドウを閉じた時、他のページに切り替えた時、ページを更新した時に発生
onClick 要素やリンクをクリックした時に発生
onDblClick 要素をダブルクリックした時に発生
onKeyUp 押していたキーをあげた時に発生
onKeyDown キーを押した時に発生
onKeyPress キーを押してる時に発生
onMouseOut マウスが離れたした時に発生
onMouseOver マウス乗った時に発生
onMouseUp クリックしたマウスを上げた時に発生
onMouseDown マウスでクリックした時に発生
onMouseMove マウスを動かしている時に発生
onDragDrop マウスでドラッグ&ドロップした時に発生 ※NN4のみ


R ラズベリーパイ(16) 〜DCモーター制御〜

by fjk

ラズパイでPWMの利用するには2種類の方法がある。「疑似的なアナログ値を出力」する方法と「精度の高いPWM」で、前者はabc748でLEDの明るさ制御に利用した。パルス幅の精度が問題となるサーボモータなどの制御には精度の高いPWM制御が必要となる。前者はソフトでパルスを作るので任意のピンを利用できるが、後者はハードウェアでパルスを作るのでpwm0(GPIO18、12)又はpwm1(GPIO13、19)を使う必要がある。高精度用はサーボモーター用とし、今回、DCモータの制御にはgpio23、gpio24を利用した。
 FA-130RAモーターには最大0.5Aの電流が流れるので、ラズパイ用とは別に電源(4本の単4)と、モータードライバーIC(TA7291P)を用いた。モータのパルス電圧が3Vを上回らないように可変抵抗器でVrefを調整した(5k+5kΩでもOK)。
 モーターには0.01μFのセラミックスコンデンサを付けたが、出力波形には大きなスパイクノイズが出ている。しかし、-100から100までの数値を入力すると、デューティ比および回転方向が変わり、スムーズに回転した。0を入力すると停止し、ctr+Cでプログラムが終了する

配線図 オシロスコープ波形例 (duty=10)

dcmotor.py 
import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)
GPIO.setup(24, GPIO.OUT)
p0 = GPIO.PWM(23, 50)
p1 = GPIO.PWM(24, 50)
p0.start(0)
p1.start(0)

try:
  while True:
    duty = int(input("input duty (-100〜100)"))
    if duty > 0 and duty <= 100:
      p0.ChangeDutyCycle(duty)
      p1.ChangeDutyCycle(0)
    elif duty < 0 and duty >= -100:
      p0.ChangeDutyCycle(0)
      p1.ChangeDutyCycle(-duty)
    else:
      p0.ChangeDutyCycle(0)
      p1.ChangeDutyCycle(0)
    sleep(0.5)

except KeyboardInterrupt:
    pass

p0.stop()
p1.stop()
GPIO.cleanup()


モーター制御風景


常時通電USBバッテリー javascriptのおさらい ラズパイ(16)〜DCモーター制御