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

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

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

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

Raspberry Pi

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

Q&A

解決済

1回答

1980閲覧

Python importしたモジュール内でimport元で宣言したオブジェクトを使いたい

sui198

総合スコア5

Python 3.x

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

Raspberry Pi

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

0グッド

0クリップ

投稿2019/09/08 02:37

###実現したいこと
Raspberry Pi 3 Model B+のpython3でL6470というステッピングモータードライバーを使いたいと思っています。
L6470制御用の関数をL6470.pyというモジュールにまとめておいて
main.pyでL6470.pyをインポートして使おうと考えています。

###発生している問題・エラーメッセージ
main.pyからL6470.pyの関数を使おうとすると下記のエラーが発生します。
main.pyでwiringpiの準備をしてL6470.pyでwiringpiを使おうとしていることが原因ではないかと思うのですが
修正方法が分からず途方にくれています。
どのように修正すればよいでしょうか?
よろしくお願いいたします。

Traceback (most recent call last): File "/home/pi/Python/main.py", line 21, in <module> L6470_init() File "/home/pi/Python/main.py", line 12, in L6470_init L6470_setparam_acc(0xFFE) File "/home/pi/Python/L6470.py", line 4, in L6470_setparam_acc L6470_transfer(0x05, 2, val) File "/home/pi/Python/L6470.py", line 8, in L6470_transfer L6470_send(add) File "/home/pi/Python/L6470.py", line 20, in L6470_send while wp.digitalRead(PIN_BUSY) == 0: NameError: name 'wp' is not defined

#使用言語
python3

該当のソースコード

#main.py

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import wiringpi as wp import struct from L6470 import * L6470_SPI_CHANNEL = 0 L6470_SPI_SPEED = 1000000 PIN_BUSY = 25 def L6470_init(): L6470_setparam_acc(0xFFE) if __name__=="__main__": speed = 0 wp.wiringPiSetupGpio() #SPI channel 0 を 1MHz で開始。 wp.wiringPiSPISetup (L6470_SPI_CHANNEL, L6470_SPI_SPEED) wp.pinMode(PIN_BUSY, 0) #PIN_BUSYを入力モードに設定 L6470_init() #L6470の初期化。

#L6470.py

def L6470_setparam_acc(val: int): L6470_transfer(0x05, 2, val) def L6470_transfer(add: int, bytes: int, val: int): data = [] * 3 L6470_send(add) for i in range(bytes): data.append(val & 0xFF) val = val >> 8 if bytes == 3: L6470_send(data[2]) if bytes >= 2: L6470_send(data[1]) if bytes >= 1: L6470_send(data[0]) def L6470_send(add_or_val: int): while wp.digitalRead(PIN_BUSY) == 0: pass data = struct.pack("B", add_or_val) #16進数のadd_or_valを2進数のdataに変換 wp.wiringPiSPIDataRW(L6470_SPI_CHANNEL, data) #アドレスもしくはデータ送信

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

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

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

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

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

guest

回答1

0

ベストアンサー

私なら手っ取り早く修正するなら以下のようにします。

L6470.py

Python

1wp = None 2def L6470_init(wp_): 3 global wp 4 wp = wp_ 5 L6470_setparam_acc(0xFFE)

main.py

Python

1 # 略 2 L6470_init(wp) 3 # 略

投稿2019/09/08 02:46

can110

総合スコア38262

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

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

sui198

2019/09/08 06:45

なるほど、main.pyで作ったwiringpiのオブジェクトを引数としてL6470.pyに渡してグローバル変数に入れてしまえばいいんですね ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問