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

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

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

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

Python 3.x

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

Q&A

解決済

2回答

702閲覧

ラズパイのGPIOについて

ROONIN

総合スコア22

Raspbian

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

Python 3.x

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

0グッド

1クリップ

投稿2020/03/11 02:26

どーしてもわからないため、教えて下さい。

Raspberry Pi 4 Model B にて Rasppbianにて
PLCと接続して、テスト段階で
0Vと3.3Vの検知をしているだけですが
まったく反応が無く、なぜか?わからずにここで
ご質問です。

Ptyhon

1#! /usr/bin/env python3 2#-*- coding: utf-8 -*- 3 4# GPIOを制御するライブラリ 5import RPi.GPIO as GPIO 6# タイマーのライブラリ 7import time 8# CSVのライブラリ 9import csv 10#ファイル削除のライブラリー 11import os 12#スクリプトを停止ライブラリー 13import sys 14 15path_w = '/home/pi/Ta_01/GPIO_TEST/202.103.1.118.txt' 16path_d = '/home/pi/Ta_01/GPIO_TEST/stop.txt' 17ID = '202.103.1.118' 18# モードの指定 19GPIO.setmode(GPIO.BCM) 20# インスタンス 21GPIO.setup(2,GPIO.IN) 22 23try: 24 while True: 25 if os.path.exists(path_w): 26 os.remove(path_w) 27 else: 28 if os.path.exists(path_d): 29 os.remove(path_d) 30 sys.exit() 31 else: 32 # GPIOの状態が0V(0)であるか比較 33 if GPIO.input(2): 34 # 0V(0)の場合に表示 35 with open(path_w,mode='a') as f: 36 f.write(ID + '_0/Num2' + '\n') 37 else: 38 # 3.3V(1)の場合に表示 39 with open(path_w,mode='a') as f: 40 f.write(ID + '_1/Num2' + '\n') 41 42 time.sleep(3) 43except KeyboardInterrupt: 44 GPIO.cleanup() 45 print("Finish")

とりあえずテスト段階で、GPIO 2番がHIGHだったら0とファイル書き出し LOWだったら1とファイル書き出して
PHP側でWEB画面を作り 監視しています。

しかし、いざPLC側から 出力しても変化なし
エラーもなく、PLC側も電圧計で測ると問題なく出力している。

そこで
Raspberry Pi 4 Model B が新しいのでライブラリーが対応していないのか?と思いましたが
ネットには情報が無い

それか単純に私のコードミスなのか・・(Ptyhonは日が浅く、全然かけません)
お詳しい方に、聞くのが早いと思い、書きました。

宜しくお願い致します。

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

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

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

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

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

dodox86

2020/03/11 06:18

さすがにそれは無いと思うので単なる確認ですが、GPIO.setmode(GPIO.BCM) と指定しているのでピン番号ではなく、GPIO番号で指定されているのですよね。
ROONIN

2020/03/11 07:11

そうですね、ピン番号では無く、GPIO番号でセットしてます。 対話モードで import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(2,GPIO.IN) v = GPIO.input(2) print(v) GPIO.cleanup() 簡単に行ったら printは1しかでませんでした。 何もない場合は0のはずが。。
dodox86

2020/03/11 07:22

> printは1しかでませんでした。 詳細は分かりませんが、接続している回路の問題もあるのではないでしょうか。(<内外でプルアップかプルダウンか、など) 質問者さんの過去のご質問をみるとラズパイ3も使われていたようなので、そちらでも同等の操作をしていたのであれば問題は無いのかもしれませんが、そういったことも含め質問文中に追記すると更に有効な回答をいただけるかもしれません。
ROONIN

2020/03/11 07:49

すいません、正確には 私はシステム技術であり、回路系は別の人が行っています 原因究明をしてもらってる状態です。 ただ、こちらのシステム側で問題があれば 私が悪いので・・・IOTは未知の分野だったので、色々とわからないことだらけです。 3の場合は、ただwebサーバー作って、小さなサーバーで運用する機会があり 専門だったので問題なかったんですが 現在は、専門外になってしまい、苦労しています。
dodox86

2020/03/11 07:54 編集

GPIOから読んだときに、回路が繋がっていない(オープン)場合にHIGH(つまり1)側に触れる使い方があるのです。それはラズパイ内部の設定によるものかもしれないし、外側の回路のせいかもしれない。私自身はラズパイ4を持っていないので確認はできませんが。そういう意味での参考までのコメントでした。
ROONIN

2020/03/11 07:59

え>>そうなんですか?? 勘違いしていました てっきり電圧が3.3V以下 0 以上 1 だと思ってました。 て・・ことは、何もきていない ですね 一応、テスト環境で、シーケンサー側のボタンを押すと 電圧計はちゃんと3.3V来てたので、間違いないと思ってますが ラズパイまで、上手く回路が行ってない 可能性がありますね。
dodox86

2020/03/11 08:11 編集

> てっきり電圧が3.3V以下 0 以上 1 だと思ってました。 > て・・ことは、何もきていない ですね 何もきていないとは言い切れませんが、それなりに理解した上でないとGPIO、正しく使えないです。壊しちゃいますよ。ラズパイ4の記事ではありませんが: [第22回 Raspberry PiのGPIO概要](https://tool-lab.com/raspberrypi-startup-22/) > てっきり電圧が3.3V以下 0 以上 1 だと思ってました。 いや、3.3V以上を1(HIGH) だとすると、下手するとラズパイが壊れちゃいますよね。また、重ねて書きますが0/1が逆の場合も有り得ます。
thkana

2020/03/11 15:34

0Vというのは、「何も繋いでいない」ということではないのは大丈夫ですか? 何も繋がっていない状態は「不定」です。回路によっては確定するかも知れませんが、一般としてはノイズとかなにかの加減でHighになったりLowになったりする、と考えて下さい。 多くのCMOSの回路では、オープン状態ではHighになりやすいです。 ということで、 > 簡単に行ったら > printは1しかでませんでした。 > 何もない場合は0のはずが。。 GNDに繋いで確実に0Vにしたらどうなりますか?
ROONIN

2020/03/12 00:09

色々とありがとうございます。 私も、設備技術者も会社の意向で、作っているので 初めての試みで 勉強不足感はあります。 一度、サイトなどを見ながら 話し合いながら もう一度考えます!ありがとうございます。
guest

回答2

0

ベストアンサー

「なぜ動かないのか」の直接の回答ではありませんが:

Pythonを使ったコードにまだ自信が持てないのであれば、いきなりすべてのコードをスクリプトに書いて実行するのではなく、Pythonの対話モードで試してみてはいかがでしょうか。

sh

1$ python3 2Python 3.6.9 (default, Nov 7 2019, 10:44:02) 3[GCC 8.3.0] on linux 4Type "help", "copyright", "credits" or "license" for more information. 5>>>

などと対話モードで実行し、以下のような最低限のGPIO関連の操作を手動でひとつひとつ入力、確認してOKとなるのが前提だと思います。

Python3

1import RPi.GPIO as GPIO 2 3GPIO.setmode(GPIO.BCM) 4GPIO.setup(2,GPIO.IN) 5v = GPIO.input(2) 6print(v) 7 8GPIO.cleanup()

投稿2020/03/11 03:22

dodox86

総合スコア9183

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

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

ROONIN

2020/03/11 03:48

そうですね 基本的な事を忘れていました 小規模から一度やってみます!
ROONIN

2020/03/13 05:40

色々な方のアドバイスのおかげで無事、できました 初心を忘れてた自分を、原点に戻してくれたdodox86さんをベストアンサーにいたしました。 もう一度、私も設備技術者も初心に戻り、試したところ ①GPIO 17にしたら思い通り0,1が出力 ②pythonもファイル処理を見直し、おかしいところを修正した 一から直したら、WEB画面で、ボタンをおしたり、自動リレーで出力しても カウントをとったり、ある指定の番号を出したりと やりたいことが全部できました。 とても助かりました。ありがとうございました。
dodox86

2020/03/13 06:06

おめでとうございます。要望通りに動いて良かったですね。
guest

0

たとえファイルを作っても、ループの最初でそのファイルが削除されてしまうように思います。
なぜそんなことをしているのか、そこでどういう動作をするのか、コードをチェックしてみては。

投稿2020/03/11 02:32

y_waiwai

総合スコア87719

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

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

ROONIN

2020/03/11 03:49

たしかに、、よくみたら 最初に消してますね・・ 多分、元々4ピン分 監視するやつにして 追記モードにしていたので 一度全部消してから、また作るみたいな作業をしていたので このような良く分からないコードを書いてました。 ご指摘ありがとうございます。 一度、コードを見直します。
Y.H.

2020/03/11 05:04

sleep(3)しているので問題ないと考えて 念のため f.write() の後に f.flush() しておいた方がいいかも。
ROONIN

2020/03/11 07:21

そうなんですか 了解致しました。 変えてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問