磁気センサーからの取得データ | おやじクリエイターがお小遣いで楽しむ工作室

おやじクリエイターがお小遣いで楽しむ工作室

趣味のことを中心に書きます。

明日から仕事です。

休みの期間がGWやお盆に比べると短かいし、年末年始はやらなければいけないことが多いのでダラダラ過ごす暇はなく、明日の出勤はそれほどきつくは感じない気がします。

 

 

前回記事 計測ボール で、投球したボールの回転数を求めるためには磁気センサーがスペック的には合っていると判断しましたが、磁気センサーからの取得値が使えるものかどうかについて調べたいと思います。

 

 

 

今回もPIC側コードと Unity側スクリプトを目的に合わせ修正します。

 

  PIC側コード

 

#include "mcc_generated_files/mcc.h"
#include "mcc_generated_files/examples/i2c_master_example.h"
#include <stdio.h>
#include <math.h>

uint8_t Buffer3[6];
int16_t cpx, cpy, cpz;


void main(void)
{
    SYSTEM_Initialize();
    I2C_Write1ByteRegister(0x68, 0x6B, 0x00); //Internal 8MHz oscillator
    I2C_Write1ByteRegister(0x68, 0x6A, 0x00); //I2C MasterMode OFF
    I2C_Write1ByteRegister(0x68, 0x37, 0x02); //I2C_BYPASS_EN
    I2C_Write1ByteRegister(0x68, 0x23, 0xFF); //FIFO Enable
    I2C_Write1ByteRegister(0x68, 0x1B, 0x18); //Full Scale Range ±2000°/s
    I2C_Write1ByteRegister(0x68, 0x1C, 0x18); //Full Scale Range ±16g/s
    
    I2C_Write1ByteRegister(0x0D, 0x0B, 0x01); 
    I2C_Write1ByteRegister(0x0D, 0x09, 0x1D); //512, 8G, 200Hz, 連続測定

 
    while (1)
    {               
        I2C_ReadDataBlock(0x0D, 0x00, Buffer3, 6);
        cpx = Buffer3[1] << 8 | Buffer3[0];
        cpy = Buffer3[3] << 8 | Buffer3[2];  
        cpz = Buffer3[5] << 8 | Buffer3[4];
        printf("%d,%d,%d\r\n",cpx, cpy, cpz);
       
    }
}

 

 

 

  Unity側スクリプト

 

using System.Collections;
using System.Collections.Generic;
using System.IO.Ports;
using System;
using UnityEngine;
using System.IO;
using System.Text;

public class Bluetooth_to_Unity : MonoBehaviour
{
    private SerialPort port;    
    private float cpx, cpy, cpz;    
    private StreamWriter sw;
    private int i;

    void Start()
    {
        port = new SerialPort("COM11", 38400, Parity.None, 8, StopBits.One);
        Debug.Log("start");

        port.NewLine = "\r\n";
        port.ReadBufferSize = 64;
        port.ReadTimeout = 50;
        port.Open();

        sw = new StreamWriter(@"Stillness.csv", true, Encoding.GetEncoding("Shift_JIS"));
        Debug.Log(sw.ToString() + "\r\n");
        sw.WriteLine("cpx, cpy, cpz");
        i = 0;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            sw.WriteLine("start");
            Debug.Log("start!\r\n");
        }

        if (port.IsOpen)
        {
            try
            {
                String data = port.ReadLine();
                sw.WriteLine(data);
                i++;
                Debug.Log(i.ToString() + " :  " + data + "\r\n");
            }
            catch (TimeoutException)
            {
            }
        }
    }

 

 

Stillness.csvというファイルにPICから送られてくるセンサー値を1行ずつ追加していきます。

センサー基板を動かした時の値について調べたいので、キーボードのSPACEキーを押してから動作開始することとし、Stillness.csvにも「start」と表示されるようにしました。

 

こちらはUnityのコンソール

 

 

Stillness.csv を表計算ソフトで開いた状態(ファイルの途中部分を抜粋)

 

 

 

  基板の回転と取得データの比較

 

基板の長手方向をだいたいの感覚で南北に平行になるように向けた状態から、各軸で2回転ずつさせた時のセンサー値を確認していきます。

 

 

Z軸回転

 

横軸 cpx(センサーのX出力)- 縦軸 cpy(センサーY出力) のグラフ は円形になっています。

横軸 cpx(センサーのX出力)- 縦軸 cpz(センサーZ出力) のグラフ はつぶれています。

 

 

Y軸回転

 

横軸 cpx(センサーのX出力)- 縦軸 cpz(センサーZ出力) のグラフ は円形になっています。

 

 

X軸回転

 

横軸 cpy(センサーのY出力)- 縦軸 cpz(センサーZ出力) のグラフ は円形になっています。

 

 

 

  振り返り

 

XYZ軸に回転させた時に比較的きれいな円形の出力が得られました。

 

実際の投球ボールの回転軸はXYZ軸から少しずつズレるので、その求め方が判ればその軸を中心に何回転しているかも判るのでしょう。

(求め方が今は全く見当つかないです。)

 

ではまた。