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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

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

Q&A

解決済

1回答

3342閲覧

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

15219e

総合スコア14

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

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

0グッド

2クリップ

投稿2019/09/24 07:53

編集2019/09/25 02:13

照度センサの値に応じ、モータ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文周辺)は、照度センサの値が閾値以下ならばモータを回すというものになっているのでしょうか。

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

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

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

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

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

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

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

y_waiwai

2019/09/24 07:56

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

2019/09/24 08:19

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

2019/09/24 08:20

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

2019/09/24 08:28

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

回答1

0

ベストアンサー

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

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

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

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

投稿2019/09/25 02:19

y_waiwai

総合スコア87747

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

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

15219e

2019/09/25 02:25

回答ありがとうございます。 wiringpi.pinMode(motor1_pin,1) の前に wiringpi.wiringPiSetupGpio() と入れたら、エラーが消滅しました! モータの電源は、回路上では違うものを使っていますが、プログラムでも何か指示が必要ということでしょうか?
y_waiwai

2019/09/25 02:30

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問