質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

Q&A

0回答

1029閲覧

ラズベリーパイ4で別タブレットからDCモータを複数制御したい

bananaboy_lab

総合スコア5

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

0グッド

0クリップ

投稿2021/02/25 03:24

前提・実現したいこと

ラズベリーパイ4を使用して別のタブレットやPCからDCモータ3個とサーボモータ1個を制御したいと考えています。また、純正カメラを使用して、別のタブレットやPCから周りの状況を確認できるようにしたいです。

DCモータはDRV8835モータドライバを通しています。

発生している問題・エラーメッセージ

webiopiを使用して、タブレットからラズパイのGPIOを制御しています。
DCモータ2個とサーボモータ1個までは動かすことができたのですが、DCモータを3個にすると制御ができなくなってしまいます。

どうしたらDCモータ3個を制御することができるでしょうか?

※DCモータを3個制御するためにGPIOを増やすとDCモータが動かなくなります。サーボモータは問題ありません。

該当のソースコード

該当のソースコード(script.py)

import

1import time 2import pigpio 3 4def getServoDutyForWebIOPi(val): 5 val_min = 0.0 6 val_max = 1.0 7 servo_min = 35000 8 servo_max = 100000 9 10 duty = int((servo_max-servo_min)*(val-val_min)/(val_max-val_min) + servo_min) 11 return duty 12 13pi = pigpio.pi() 14pi.set_mode(18, pigpio.OUTPUT) 15pi.set_mode(19, pigpio.OUTPUT) 16pi.hardware_PWM(18, 50, getServoDutyForWebIOPi(0.5)) 17pi.hardware_PWM(19, 50, getServoDutyForWebIOPi(0.5)) 18 19# デバッグ出力を有効に 20webiopi.setDebug() 21 22# GPIOライブラリの取得 23GPIO = webiopi.GPIO 24 25PWM1 = 25 26PWM2 = 24 27PWM3 = 23 28PWM4 = 22 29PWM5 = 21 30PWM6 = 20 31 32# WebIOPiの起動時に呼ばれる関数 33def setup(): 34 webiopi.debug("Script with macros - Setup") 35 # GPIOのセットアップ 36 GPIO.setFunction(PWM1, GPIO.PWM) 37 GPIO.setFunction(PWM2, GPIO.PWM) 38 GPIO.setFunction(PWM3, GPIO.PWM) 39 GPIO.setFunction(PWM4, GPIO.PWM) 40 GPIO.setFunction(PWM5, GPIO.PWM) 41 GPIO.setFunction(PWM6, GPIO.PWM) 42 43 # 初期のデューティー比を0%に(静止状態) 44 GPIO.pwmWrite(PWM1, 0) 45 GPIO.pwmWrite(PWM2, 0) 46 GPIO.pwmWrite(PWM3, 0) 47 GPIO.pwmWrite(PWM4, 0) 48 GPIO.pwmWrite(PWM5, 0) 49 GPIO.pwmWrite(PWM6, 0) 50 51# WebIOPiにより繰り返される関数 52def loop(): 53 webiopi.sleep(5) 54 55# WebIOPi終了時に呼ばれる関数 56def destroy(): 57 webiopi.debug("Script with macros - Destroy") 58 # GPIO関数のリセット(入力にセットすることで行う) 59 GPIO.setFunction(PWM1, GPIO.IN) 60 GPIO.setFunction(PWM2, GPIO.IN) 61 GPIO.setFunction(PWM3, GPIO.IN) 62 GPIO.setFunction(PWM4, GPIO.IN) 63 GPIO.setFunction(PWM5, GPIO.IN) 64 GPIO.setFunction(PWM6, GPIO.IN) 65 pi.stop() 66 67# 4つのPWMにデューティー比をまとめてセットするためのマクロ 68# commandIDは、iOSのSafariでPOSTがキャッシュされることへの対策 69@webiopi.macro 70def pwm6Write(duty1, duty2, duty3, duty4, duty5, duty6, commandID): 71 GPIO.pwmWrite(PWM1, float(duty1)) 72 GPIO.pwmWrite(PWM2, float(duty2)) 73 GPIO.pwmWrite(PWM3, float(duty3)) 74 GPIO.pwmWrite(PWM4, float(duty4)) 75 GPIO.pwmWrite(PWM5, float(duty5)) 76 GPIO.pwmWrite(PWM6, float(duty6)) 77 78@webiopi.macro 79def setHwPWM(duty, commandID): 80 pi.hardware_PWM(18, 50, getServoDutyForWebIOPi(float(duty)))

該当のソースコード(javascript.js)

// タッチのサポート状況のチェック用変数 var support = { pointer: window.navigator.pointerEnabled, mspointer: window.navigator.msPointerEnabled, touch: 'ontouchstart' in window }; // タッチの場合わけ。pointer系:IE11以降、MSPointer系:IE10、touch系:android、iPhone、iPad var touchStart = support.pointer ? 'pointerdown' : support.mspointer ? 'MSPointerDown' : 'touchstart'; var touchMove = support.pointer ? 'pointermove' : support.mspointer ? 'MSPointerMove' : 'touchmove'; var touchEnd = support.pointer ? 'pointerup' : support.mspointer ? 'MSPointerUp' : 'touchend'; function initialize_webiopi(){ // webiopiの準備が終わってからstyles.cssを適用する applyCustomCss('styles.css'); mCanvas = document.getElementById("canvas"); mCtx = mCanvas.getContext('2d'); resize_canvas(); // タッチエリアの設定 var touchArea = $("#touchArea")[0]; // タッチイベントのイベントリスナーの登録 touchArea.addEventListener(touchStart, touchEvent, false); touchArea.addEventListener(touchMove, touchEvent, false); touchArea.addEventListener(touchEnd, touchEndEvent, false); }); // GPIOの状態を監視しない webiopi().refreshGPIO(false); } // スライダの最小値、最大値、刻み幅、初期値 var sliderMin = 0; var sliderMax = 20; var sliderStep = 1; var sliderValue = sliderMax/2; // jQuery UIによるスライダの設定 $(function() { // スライダを動かしたときに呼ばれるイベントハンドラの設定 var sliderHandler = function(e, ui){ var ratio = ui.value/sliderMax; // サーボの回転の向きを逆にしたい場合次の行を無効に ratio = 1.0 - ratio; webiopi().callMacro("setHwPWM", [ratio, commandID++]); }; // スライダへ設定を適用 $( "#slider_servo" ).slider({ orientation: "vertical", min: sliderMin, max: sliderMax, step: sliderStep, value: sliderValue, change: sliderHandler, slide: sliderHandler }); }); // 前に送信したデューティー比を覚えておく var rate25Prev = 0; var rate24Prev = 0; var rate23Prev = 0; var rate22Prev = 0; var rate21Prev = 0; var rate20Prev = 0; // デューティー比がth (0.0~1.0) 以上変化した時のみ値を送信 var th = 0.1; // モーターの最大速度 (0.0~1.0)。モーターを保護する意味で1.0にはしない方が良い var maxSpeed = 0.7; // 命令送信ごとに増加するIDを作成(iOSのSafariでPOSTがキャッシュされることの対策) var commandID = 0; var mCount = 0; var mCanvas; var mCtx; var mImg1; var mImg2; var mImgArrow; var mWidth = 640; var mHeight = 480; var host = location.host; var hostname = host.split(":")[0]; var port= 9000; var URL1 = 'http://' + hostname + ':' + port + '/?action=snapshot'; var URL2 = 'http://' + hostname + ':8000/bb/06/img/CrawlerControllerTrans.png'; var mTouchWidth; var mTouchHeight; var mTouchOffsetTop; var mTouchOffsetLeft; function imageSetup(){ mImg1 = new Image(); mImg2 = new Image(); mImgArrow = new Image(); mImg1.src = URL1 +'&'+(mCount++); mImgArrow.src = URL2; mImg1.onload = function() { mImg2.src = URL1 + '&' + (mCount++); mCtx.drawImage(mImg1, 0, 0, mWidth, mHeight); mCtx.drawImage(mImgArrow, 0, 0, mWidth, mHeight); }; mImg2.onload = function() { mImg1.src =URL1 + '&' + (mCount++); mCtx.drawImage(mImg2, 0, 0, mWidth, mHeight); mCtx.drawImage(mImgArrow, 0, 0, mWidth, mHeight); }; ### 試したこと DCモータのつなぎ方を変えたりしてみましたが、反応がありませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/02/26 00:23

私はRaspberry Pi2とZeroしか持っておらず、4とはPWMはちょっと違っているらしいのでお手伝いできませんがそれはともかく、 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12239411482 https://teratail.com/help#posted-otherservice を参考に適宜。 「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」とのことです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問