見出し画像

【ロードスターの電子工作#1】ラズパイのセットアップとG-Gダイアグラムの試作

こんにちは.ice macaroonsです!
今回は,ラズパイのセットアップ作業とG-Gダイアグラムの試作を行いました.サンプルコードも載せておくの良かったら読んでみてください!

#0 の記事はこちら.

ラズパイのセットアップ

まずはラズパイを使える状態に使用ということで,組み立てとOSのインストール等の初期設定を行いました.

用意したスターターキット.購入したのが少し前なので,現在売られている商品とはケースの形状等異なりますが,基本構成は同様でした.

最初は組み立てから.スターターキットに付属のセットアップマニュアルのリンク先は not foundだったので,ネットで検索して出てきた以下のリンクを参考に作業しました.

扱っているキットは別の販売店のものですが,中身の構成はほぼ同じでしたので,同様の順序で作業しました.

OSのインストール等の初期設定はこちらのリンク先も併せて参照し,実施していきます.

この辺りは,ラズパイ購入者が全員行う作業だと思いますので,情報も豊富で苦労なく作業が進みました!

難なく起動まではできました.

日本語入力ができない

無事起動できるようになったので,ラズパイに最初からあったブラウザ「Chromium」で検索をかけてみようとしたところ,日本語入力ができませんでした.

そのため,ネットで調べたところ以下の記事がヒット.

こちらのページに記載されたとおりに作業を行うことで,日本語入力ができるようになりました.

gpioコマンド実行時にエラーが出る

ラズパイではセンサとの接続時にGPIOピンを使用します.このGPIOピンの情報を取得するコマンドがgpioコマンドです.まずはこのピン配置を確認するために以下のコマンドを入力すると,エラーが帰ってきてしまいました.

pi@raspberrypi:~ $ gpio readall
Oops - unable to determine board type... model: 17

こちらも調べてみると,WiringPiというライブラリが古いことが原因だということがわかりました.詳しくはこちらに記載されています.

しかし,上記サイトの対処法では私の環境ではうまくいかなかったため,さらに詳しく調べました.いろいろな方法を手当たり次第にやってみて最終的にうまくいったのは,以下のサイトの方法でした.

これでラズパイ側で,Gセンサの情報を受け取る準備ができたので,次はセンサをラズパイにつないでみます.

Gセンサをラズパイにつなぐ

お次はGセンサとラズパイの接続です.前回も紹介しましたが,使用するGセンサは「MPU-6050」です.

こちらの商品をラズパイに接続するには,付属のピンをはんだ付けで固定する必要があるので,はんだごてを購入して実施しました.はんだごてを使うのは学生時代ぶりでしたので,独特のにおいを少し懐かしく感じました(笑)

このセンサのピンと,ラズパイのGPIOピンをつなぐのに必要なジャンパワイヤも別途購入しています.ジャンパワイヤというのはこういうやつです.

ピンにさすだけで電気的に接続できる便利な電線ですね.

ハード的な準備が完了したので,さっそくラズパイにつないでいきます.
ラズパイ側のピン配置は以下のコマンドで確認できます.

pi@raspberrypi:~ $ pinout

こちらのコマンドを入力することで,以下のようにピン配置を確認することができます.

   3V3  (1) (2)  5V
 GPIO2  (3) (4)  5V
 GPIO3  (5) (6)  GND
 GPIO4  (7) (8)  GPIO14
   GND  (9) (10) GPIO15
GPIO17 (11) (12) GPIO18
GPIO27 (13) (14) GND
GPIO22 (15) (16) GPIO23
   3V3 (17) (18) GPIO24
GPIO10 (19) (20) GND
 GPIO9 (21) (22) GPIO25
GPIO11 (23) (24) GPIO8
   GND (25) (26) GPIO7
 GPIO0 (27) (28) GPIO1
 GPIO5 (29) (30) GND
 GPIO6 (31) (32) GPIO12
GPIO13 (33) (34) GND
GPIO19 (35) (36) GPIO16
GPIO26 (37) (38) GPIO20
   GND (39) (40) GPIO21

私の場合,ラズパイ本体に付属の冷却ファンの電源を1番,グラウンドを6番でとっています.

そこでMPU-6050の電源(VCC)を,3.3Vの17番に接続し,グラウンド(GND)は9番に.センサからのクロック信号SCLを5番に、データ信号SDAは7番につなぎました.

その後以下のリンク先の,「センサーデータを取得する」の項を参考に,I2Cの有効化MPU6050モジュールのインストールを行い,ページ中段に記載されている「mpu6050plot.py」というコードで接続確認を行いました.

https://www.blog.danishi.net/2020/04/23/post-3454/

こちらのコードを以下のコマンドを入力することでpythonで実行します.

pi@raspberrypi:~ $ python3 mpu6050plot.py

すると加速度と角速度,おまけで温度のリアルタイムプロットが画面上に出力され,異常なく接続ができていることが確認できました!

サンプルコードの改良

ここまでこれば,あとはサンプルコードをG-Gダイアグラムの形に改良していくだけですね.書き出すと一瞬ですが,実際はここまで半日くらいかかっています(笑)

例のごとくネットでいろいろ調べて書いたコードがこちらです.

from mpu6050 import mpu6050
from time import sleep

sensor = mpu6050(0x68)

import numpy as np
import matplotlib.pyplot as plt

def plot_loop():
    # センサーデータ取得
    accel_data = sensor.get_accel_data()
    
    fig, (ax_accel) = plt.subplots(ncols=1, figsize=(10,10))

    # 加速度のY座標
    # ロール軸(x)
    accel_list_x = np.zeros(10)
    accel_list_x[0] = "%6.3f" % accel_data['x']
    accel_list_x[0] = accel_list_x[0]/9.81
    #accel_x_lines, = ax_accel.plot(sec, accel_list_x, color="red", label="x")

    # ピッチ軸(y)
    accel_list_y = np.zeros(10)
    accel_list_y[0] = "%6.3f" % accel_data['y']
    accel_list_y[0] = accel_list_y[0]/9.81
    #accel_y_lines, = ax_accel.plot(sec, accel_list_y, color="blue", label="y")
    
    accel_lines, = ax_accel.plot(accel_list_y, accel_list_x, color="red", label="x")
    accel_dot, = ax_accel.plot(accel_list_y[0], accel_list_x[0], "o", ms= 20, color="blue", label="g")
        
    ax_accel.legend() # ラベル描画
    ax_accel.set_title("g-g diagram")
    ax_accel.set_xlim(-.5, .5)
    ax_accel.set_ylim(-.5, .5)

    # plotし続ける
    while True:
        # センサーデータ取得
        #gyro_data = sensor.get_gyro_data()
        accel_data = sensor.get_accel_data()
        
        # データの更新
        accel_list_x = np.roll(accel_list_x, 1)
        accel_list_x[0] = "%6.3f" % accel_data['x']
        accel_list_x[0] = accel_list_x[0]/9.81
        accel_list_y = np.roll(accel_list_y, 1)
        accel_list_y[0] = "%6.3f" % accel_data['y']
        accel_list_y[0] = accel_list_y[0]/9.81

        # グラフへデータの再セット
        accel_lines.set_data(accel_list_y, accel_list_x)
        accel_dot.set_data(accel_list_y[0], accel_list_x[0])
        plt.pause(0.01) # sleep時間(秒)

if __name__ == "__main__":
    plot_loop()

こちらを先ほどと同様にpython3コマンドで実行した結果がこちらです.

何とかうまくいきました.良かった.

ただ,描画間隔が長すぎてカクカクした感じになってしまっているところが気になりますね.今後の課題です.

終わりに

とりあえずG-Gダイアグラムらしきものをリアルタイムプロットできるようになったので,今回はここまでにします.

次回はもう少し見やすい表示にすることと,描画間隔を短くできればと考えていますが,うまくいくかは不明です(笑)

#2はこちら

以上,ice macaroonsからでした.参考になったよという方は,noteのいいね,YouTubeのチャンネル登録やinstagramのいいねでリアクション頂けると嬉しいです!
最後まで読んでいただきありがとうございました!!!
Youtubeチャンネルとinstagramはこちら

CARTUNEとみんカラもやってます!

この記事が気に入ったらサポートをしてみませんか?