🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

1回答

1823閲覧

Arudinoで取得した傾きデータをpygameを使用して画面に表示したい

_mini

総合スコア15

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/01/29 07:27

編集2021/01/29 07:44

ArudinoとMPU6050を使い、ロール軸とピッチ軸の値を取得し、そのデータをリアルタイムで画面表示したいのですが、考えているものがうまく実行できず検索しても似ているものが出てこなかったので質問させていただきます。

以下の画像のように+127~-127までのロール軸、ピッチ軸を表示し、センサーの傾きに応じて○が移動するようなものを作成したいです。
pygameは触れるのが初めてなのでどのように使用するかを模索しつつ考えているので、このようなものができない場合は似た形で実装できそうであればその方法も教えていただきたいです。

arudinoのコード

#include <Wire.h> #include <MadgwickAHRS.h> Madgwick MadgwickFilter; #define MPU6050_PWR_MGMT_1 0x6B #define MPU_ADDRESS 0x68 void setup() { Wire.begin(); Serial.begin(115200); //115200bps Wire.beginTransmission(MPU_ADDRESS); Wire.write(MPU6050_PWR_MGMT_1); //MPU6050_PWR_MGMT_1レジスタの設定 Wire.write(0x00); Wire.endTransmission(); MadgwickFilter.begin(100); //100Hz } void loop() { Wire.beginTransmission(0x68); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(0x68, 14, true); while (Wire.available() < 14); int16_t axRaw, ayRaw, azRaw, gxRaw, gyRaw, gzRaw, Temperature; axRaw = Wire.read() << 8 | Wire.read(); ayRaw = Wire.read() << 8 | Wire.read(); azRaw = Wire.read() << 8 | Wire.read(); Temperature = Wire.read() << 8 | Wire.read(); gxRaw = Wire.read() << 8 | Wire.read(); gyRaw = Wire.read() << 8 | Wire.read(); gzRaw = Wire.read() << 8 | Wire.read(); // 加速度値を分解能で割って加速度(G)に変換する float acc_x = axRaw / 16384.0; //FS_SEL_0 16,384 LSB / g float acc_y = ayRaw / 16384.0; float acc_z = azRaw / 16384.0; // 角速度値を分解能で割って角速度(degrees per sec)に変換する float gyro_x = gxRaw / 131.0; // (度/s) float gyro_y = gyRaw / 131.0; float gyro_z = gzRaw / 131.0; //Madgwickフィルターを用いて、PRY(pitch, roll, yaw)を計算 MadgwickFilter.updateIMU(gyro_x, gyro_y, gyro_z, acc_x, acc_y, acc_z); //PRYの計算結果を取得する float roll_1 = MadgwickFilter.getRoll(); float pitch_1 = MadgwickFilter.getPitch(); float yaw = MadgwickFilter.getYaw(); int roll_int,pitch_int,bitshift,i=1; roll_int = int(roll_1) << 8; pitch_int = int(pitch_1 * -1); bitshift = roll_int + pitch_int; // Serial.print("roll:");Serial.print(roll); Serial.print(","); // Serial.print("pitch:"); Serial.print(pitch); Serial.println(","); Serial.println(bitshift);

pythonのコード
今回の質問と直接関係ない部分は省かせていただいております。

# coding: UTF-8 # ジョイスティックWHILL操作システム import time from pygame.time import wait import serial from whill import ComWHILL import pygame from pygame.locals import * import sys import copy import math # 定数定義 SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 LEVELSTEPNUM = 10 ser = serial.Serial("COM7", 115200) # Arduinoが接続されているCOMポートを指定 def main(): global startTime pygame.init() # 初期化 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) # 画面を作る pygame.display.set_caption("whill controller") font = pygame.font.Font(None, 30) clock = pygame.time.Clock() FPS = 120 # メイン関数 while True: # デバイスの入力 getDeviceData() # キー入力で終了 for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN: if event.key == K_ESCAPE: pygame.quit() sys.exit() pygame.display.update() clock.tick(FPS) # 傾き判別 def getDeviceData(): Speed, RotationSpeed = 0, 0 getData1 = str(ser.readline().rstrip().decode( encoding='utf-8', errors='ignore')) data = int(getData1) Speed = (data & 65280) >> 8 RotationSpeed = data & 255 if Speed > 127:  Speed -= 255 if RotationSpeed > 127: RotationSpeed -= 255 print(Speed, RotationSpeed) if __name__ == "__main__": main()

イメージ説明

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

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

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

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

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

y_waiwai

2021/01/29 07:32

コードを提示しよう
_mini

2021/01/29 07:39

現在pygameについては勉強中なので、arudino,pythonの書いているプログラムを載せます
guest

回答1

0

通信がダメですね
Arduinoの送信側、各データを文字列に変換して、シリアルポートに出力しましょう
まずは、ArduinoIDEの通信モニタで、出力データを見てみてください


getDeviceDataの関数から受信データが渡っていませんね
Speed, RotationSpeedの変数をreturn で返す必要があります
main関数の方で、getDeviceDataから返された2つのデータをもとに描画する、ということになりますね

#スプライトを使って目標を動かす、というのが良さそうです

投稿2021/01/29 08:07

編集2021/01/29 08:26
y_waiwai

総合スコア88038

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

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

_mini

2021/01/29 08:13

arudinoのシリアルモニタで上記のコードを動かすと、ロールとピッチをビットシフトし、一つにまとめられた値が表示されます。 ロールとピッチはコメントアウトしておりますが、こちらも正常に表示されます。 またPythonを同時に動かた時のspeedとrotationspeedも傾きに応じて値が変化しております。
y_waiwai

2021/01/29 08:26

回答に追記しました
_mini

2021/01/29 08:45

printの下にreturn(Speed,RotationSpeed)とおいてみました。 スプライトについて調べていますが、取得した値をもとに〇を動かすということが難しいです。
y_waiwai

2021/01/29 08:49

まずはそれで、main関数に値が渡せるのかを確認しよう。 まあ、スプライトってのは一例ですんで、いろいろ調べて悩んでみてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問