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

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

ただいまの
回答率

87.37%

照度センサとモータをPython3で制御したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,688

score 14

照度センサの値に応じ、モータ2つを動かすプログラムを作りたいです。

照度センサの値を出すプログラムと、モータ1つを回すプログラム、それぞれ単体では上手くできましたが、組み合わせてみた結果がうまくいきません。

SDカードをフォーマットし直したところ、つかなくなってしまっていたラズパイが使えるようになったため、大幅に加筆修正させて頂きます。

# GPIOを制御するライブラリ
import wiringpi
# タイマーのライブラリ
import time
# 引数取得
import sys

# MCP3002(A/Dコンバータ)を接続したチャンネルを指定
SPI_CH = 0

# 読み込み対象のMCP3002(A/Dコンバータ)のアナログ入力チェンネルを指定
READ_CH = 0

#モータを動かすためのGPIO端子の設定
motor1_pin = 23
motor2_pin = 24
motor3_pin = 27
motor4_pin = 28

# 明るさの閾値を引数指定
param = sys.argv
set_illuminance = int(param[1])

# SPI初期化
wiringpi.wiringPiSPISetup( SPI_CH, 1000000 )

while True:
    # MCP3002(A/Dコンバータ)に送るデータを作成
    buffer = 0x6800 | ( 0x1800 * READ_CH )
    buffer = buffer.to_bytes( 2, byteorder='big' )

    # SPIを使ってCH0の値を取得
    wiringpi.wiringPiSPIDataRW( SPI_CH, buffer )

    # 値が2バイトに分かれて送られるので、1つの値にまとめる
    illuminance_value = ( buffer[0] * 256 + buffer[1] ) & 0x3ff

    # 明るさの基準値を下回ったらモータを回す
    if ( illuminance_value < set_illuminance ):
        wiringpi.digitalWrite( motor1_pin, 1 )
        wiringpi.digitalWrite( motor2_pin, 0 )
        wiringpi.digitalWrite( motor3_pin, 1 )
        wiringpi.digitalWrite( motor4_pin, 0 )
    else:
        wiringpi.digitalWrite( motor1_pin, 1 )
        wiringpi.digitalWrite( motor2_pin, 1 )
        wiringpi.digitalWrite( motor3_pin, 1 )
        wiringpi.digitalWrite( motor4_pin, 1 )

    # 10秒ずつ検出
    time.sleep(10)

出されたエラーは、

pinMode: You have not called one of the wiringPiSetup functions, so I'm aborting your program before it crashes anyway.

です。調べたのですが、解決方法がわかりませんでした。しかし、クラッシュとあるため、このまま続けると何かまずいことが起こるのではないかと思っています。

そもそも、このプログラム(特にif文周辺)は、照度センサの値が閾値以下ならばモータを回すというものになっているのでしょうか。

なっていないのであれば、修正点を教えていただけると大変ありがたいです。

ーーーーーーーーーーーーーーーーーーー

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/09/24 16:56

    しつもんはなんでしょうか

    キャンセル

  • 15219e

    2019/09/24 17:19

    すみません、一番大切なものが抜けていました。ご指摘ありがとうございます。加筆しておきます。

    キャンセル

  • y_waiwai

    2019/09/24 17:20

    ついでに、その出たというエラー・メッセージも、そのままの形で提示しましょう

    キャンセル

  • 15219e

    2019/09/24 17:28

    Raspberry Piの電源が入らなくなってしまったため、エラーを確認することができません。覚えている限り、crashes anyways が含まれるもの(このままだと何らかの原因によって壊れるから処理を止めた、という旨だったと思われます)、
    そのGPIOは既に使用されているという旨のもの、
    a( ) or a[ ] のようなものが含まれるもの、だったと思うのですが…
    曖昧で大変申し訳ありません。

    キャンセル

回答 1

checkベストアンサー

0

google翻訳
pinMode: あなたは、wiringPiSetup関数の1つを呼び出していないので、とにかくクラッシュする前にプログラムを中止します。

壊れるとかそういうはなしではなく、GPIOの初期化関数の実行が足りていないということですね

で、モータを動かすという場合、モータの電源は、ラズパイとは別に用意しましょう
ラズパイと同じ電源でモータを駆動すると、そのノイズやらドロップやらでまともに動きません

#もしかすると壊れることもあるかも

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/25 11:25

    回答ありがとうございます。

    wiringpi.pinMode(motor1_pin,1)
    の前に
    wiringpi.wiringPiSetupGpio()
    と入れたら、エラーが消滅しました!

    モータの電源は、回路上では違うものを使っていますが、プログラムでも何か指示が必要ということでしょうか?

    キャンセル

  • 2019/09/25 11:30

    電源を別にしてるならそんでいいです。

    モータというのはコイルの塊ですんで、電源の入り切りでサージがでたりノイズが盛大に出たりするんで、極力その配線と、CPUが関わる配線は近寄らないようにすべきです

    キャンセル

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る