編集履歴一覧に戻る
TentoBugのアイコン画像

TentoBug が 2025年01月26日14時49分30秒 に編集

割込み

本文の変更

# はじめに  SPRESENSEに、どのような機能があるかを確認することを年末年始とコンテストの目標にしました。さわっているうちにGPIOやI2Cやパソコンのシリアルポートと通信ができることが分かりました。さらにGNSSを利用して位置情報の機能があることを知りました。なにか実験してみようと思って、教科書を眺めていますと 等速円運動の大きさ $v =r \omega$ 加速度の大きさ   $a =r \omega^2$ 向心力       $F =\frac{mv^2}{r}$ が目に入り、 ![キャプションを入力できます](https://camo.elchika.com/7a18d45cfc7a3efae4fc541bb0565e979044b61c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f63653237393765362d626263382d343265652d623632312d386436623565383038303866/) という具合に袋にSPRESENSEを入れて回すか、グルグル走るかしたら、なんか見えるのかなと思い図工しだしました。  今のところI2Cを用いた表示とパソコンとの通信はできましたが、室内で速度vとωの確認で行き詰った感じです。その記録です。 # 部品 || 部品 | 備考(敬称略) | |:---:|:---:|:---:| |U1、U3| SPRESENSE | | |U2| MM-TXS01 | サンハヤト | |U4| AE-AQM0802 | 秋月電子通商 | |D1| LED(赤) | | |D2| LED(黄) | |

+

|U5| RPR-220 | ローム |

|| 減速機 | タミヤ | || 安定化電源 | |

+

|| USBケーブル | ジャンク品 | || 電池BOX | |

# 設計図

-

![3Dプリンタで印刷した固定具の図](https://camo.elchika.com/9ac77927fab8a567b576a35050f407c7e4707ab1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f64353431636333652d643432352d343561622d616561642d313333313165326234616630/) ![回路図](https://camo.elchika.com/52994f18e587b288172161eae90f22ad4e21d49d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f32316538333531392d363030622d346363662d383331622d623431376430666266333362/) ![部品をくっつけた写真](https://camo.elchika.com/7595b706cfe0b7a6892a5128098f9e64fb9fb817/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f38613861346433332d363766342d346635322d613561612d353837666132636230303262/)

+

![回路図](https://camo.elchika.com/5b44d28313d10cf1e0743898e92b3f47e3687cee/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f35653138366231322d633764322d343065322d393437352d333837386663313732623265/)

PIN_D16やPIN_D17にハイ電圧をかけることで、3種類のケースに分けます。

+

![3Dプリンタで印刷する固定具](https://camo.elchika.com/e71551b904199eaff790606dd44ef3811050ca42/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f66646337633263382d376334362d343831362d626634382d393866353934383832623739/)

# ソースコード  2024年 SPRESENSE™ 活用コンテストのチュートリアルにあるArduino IDEで作成しました。付属スケッチ例にあるgnssをを素にして作成しました。 ```arduino:実験中 #include <time.h> #include <FFT.h> #include <GNSS.h> #include <Wire.h>/* I2C*/ #include <Flash.h> #include <File.h> #define STRING_BUFFER_SIZE 128 /**< %Buffer size */ static SpGnss Gnss; /**< SpGnss object */ int duty=0; File FlashFile;

+

uint64_t btime=0; unsigned long syuki=0;

unsigned int warikomi(void){ digitalWrite(PIN_D22, HIGH); delayMicroseconds(duty); digitalWrite(PIN_D22, LOW); delayMicroseconds(500-duty); return 500; }

+

unsigned int photosensor(void){ syuki=(unsigned long)(millis()-btime); btime=millis(); return 1; }

void lcdClear(){ char command[]={0x38,0x01}; Wire.beginTransmission(0x3E); Wire.write(command,2); Wire.endTransmission(); delay(200); } void lcd1(char* StringBuffer){ Wire.beginTransmission(0x3E); Wire.write(0x00); Wire.write(0x80); Wire.endTransmission(); delay(1); Wire.beginTransmission(0x3E); Wire.write(0x40); Wire.write(StringBuffer,8); Wire.endTransmission(); delay(1); } void lcd2(char* StringBuffer){ Wire.beginTransmission(0x3E); Wire.write(0x00); Wire.write(0x80+0x40); Wire.endTransmission(); delay(1); Wire.beginTransmission(0x3E); Wire.write(0x40);

-

Wire.write(StringBuffer,7);

+

Wire.write(StringBuffer,8);

Wire.endTransmission(); delay(1); } void setup() { char StringBuffer[STRING_BUFFER_SIZE]; /* ポートの設定 */ pinMode(PIN_D02, OUTPUT); pinMode(PIN_D22, OUTPUT); pinMode(PIN_D23, OUTPUT);

+

pinMode(PIN_D21, INPUT_PULLDOWN);

pinMode(PIN_D16, INPUT_PULLDOWN); pinMode(PIN_D17, INPUT_PULLDOWN); /* シリアル通信設定 */ Serial.begin(115200); sleep(3);

+

attachInterrupt(PIN_D21, photosensor, RISING);

attachTimerInterrupt(warikomi,500);//us duty=0;

+

syuki=0;

/*LCDモジュール初期化*/ int i=0; char command[]={0x38,0x39,0x14,0x70,0x56,0x6C,0x38,0x0C,0x01}; digitalWrite(PIN_D02, LOW); delay(200); digitalWrite(PIN_D02, HIGH); Wire.begin(); delay(200); Wire.beginTransmission(0x3E); Wire.write(command,9); Wire.endTransmission(); delay(200); snprintf(StringBuffer, STRING_BUFFER_SIZE, "setup "); lcd1(StringBuffer); /* Set serial baudrate. */ Serial.begin(115200); /* Set Debug mode to Info */ Gnss.setDebugMode(PrintInfo); int result; /* Activate GNSS device */ result = Gnss.begin(); Gnss.select(GPS); Gnss.select(QZ_L1S); Gnss.select(QZ_L1CA); Gnss.setInterval(SpInterval_10Hz); /* Start positioning */ result = Gnss.start(COLD_START); } static void print_0(SpNavData *pNavData) { char StringBuffer[STRING_BUFFER_SIZE];

+

int e=0;

struct tm now;

-

int e=0;

/* 日本時間の設定 日付?*/ now.tm_year =pNavData->time.year; now.tm_mon =pNavData->time.month; now.tm_mday =pNavData->time.day; now.tm_hour =pNavData->time.hour+9; now.tm_min =pNavData->time.minute; now.tm_sec =pNavData->time.sec; //mktime(&now); snprintf(StringBuffer, STRING_BUFFER_SIZE, "%02d:%02d:%02d,%f,%3.3f,%d", now.tm_hour,// pNavData->time.minute, pNavData->time.sec, pNavData->direction, pNavData->velocity, //速さ duty ); Serial.print(StringBuffer); Serial.println(""); /* LCD2行目 */

-

snprintf(StringBuffer, STRING_BUFFER_SIZE, "%2d %3.2f",

+

snprintf(StringBuffer, STRING_BUFFER_SIZE, "%2d %5ld",

pNavData->numSatellites,

-

pNavData->direction);

+

syuki);

lcd2(StringBuffer); /* LCD1行目 */ snprintf(StringBuffer, STRING_BUFFER_SIZE, "%02d:%02d:%02d", now.tm_hour,// pNavData->time.minute, pNavData->time.sec); lcd1(StringBuffer); } static void print_1(SpNavData *pNavData) { char StringBuffer[STRING_BUFFER_SIZE];

+

int e=0;

struct tm now;

-

int e=0;

/* 日本時間の設定 日付?*/ now.tm_year =pNavData->time.year; now.tm_mon =pNavData->time.month; now.tm_mday =pNavData->time.day; now.tm_hour =pNavData->time.hour+9; now.tm_min =pNavData->time.minute; now.tm_sec =pNavData->time.sec; snprintf(StringBuffer, STRING_BUFFER_SIZE, "%02d %02d %2d", pNavData->time.minute, pNavData->time.sec, pNavData->numSatellites ); /* LCD1行目 */ lcd1(StringBuffer); if (pNavData->posDataExist == 1){ duty=250;

-

snprintf(StringBuffer, STRING_BUFFER_SIZE, "%02d:%02d:%02d.%06ld,%6f,%6f,%3.3f,%3.3f,%3.3f,%d",

+

snprintf(StringBuffer, STRING_BUFFER_SIZE, "%02d:%02d:%02d.%06ld,%6f,%6f,%3.3f,%3.3f,%3.3f,%d,%5ld",

now.tm_hour,// pNavData->time.minute, pNavData->time.sec, pNavData->time.usec, pNavData->latitude, pNavData->longitude, pNavData->direction,//角度 pNavData->velocity, //速さ pNavData->altitude,

-

pNavData->numSatellites//衛星

+

pNavData->numSatellites,//衛星 syuki

); Serial.print(StringBuffer); Serial.println(""); //Flash.begin(); File f=Flash.open("shimako/data.csv",FILE_WRITE); f.println(StringBuffer); f.close(); /* LCD2行目 */

-

snprintf(StringBuffer, STRING_BUFFER_SIZE, " go ");

+

snprintf(StringBuffer, STRING_BUFFER_SIZE, "%2d %5ld", pNavData->numSatellites, syuki);

lcd2(StringBuffer); }else{ duty=0; snprintf(StringBuffer, STRING_BUFFER_SIZE, "wait...."); lcd2(StringBuffer); } } /* ファイルの読み込んで送信 */ void r() { lcdClear(); lcd1("r "); FlashFile = Flash.open("shimako/data.csv"); if (FlashFile) { Serial.println("data.csv"); while (FlashFile.available()) { Serial.write(FlashFile.read()); } Serial.print("\r\n"); //受け側による。タイムアウト・・・。 FlashFile.close(); } else { /* ファイルがない時 */ Serial.println("error"); } } /* ? */ void d(){ lcdClear(); lcd1("d "); Serial.println("filepath"); String filepath; Flash.exists(filepath); Serial.println(filepath); } /* 初期化 */ void f(){ lcdClear(); lcd1("f "); Serial.println("format"); Flash.format(); Flash.mkdir("shimako/"); Serial.println("good"); } int ad=0; int hugo=1; SpNavData NavData; void loop() { int sw=digitalRead(PIN_D16)+2*digitalRead(PIN_D17); //メニュー switch (sw){ case 0: Gnss.getNavData(&NavData); print_0(&NavData); break; case 1: if(Gnss.isUpdate()==1){ Gnss.getNavData(&NavData); print_1(&NavData); } break; case 2: unsigned int SelialCom; //lcdClear(); lcd1("r f d "); lcd2(" "); SelialCom=Serial.read(); switch(SelialCom){ case 'r': r(); break; case 'f': f(); break; case 'd': d(); break; } break; } }

-

```

-

# 実験1 1. PIN_D16にハイ電圧PIN_D17浮かフ?(プルダウン設定をしていたら?) 2. 履いたり休んり階段歩たり散歩しした

+

# 実験 1. 3Dプリンタで固定具を印刷して減速機など固定しま。減速機の六角棒40mmに切断しました。反射ンサ目印として100mm x 20mmの紙片を置きます。 2. 横棒の上にSPRESENSEなど中心から15cm位の場所に固定します。 ![正面](https://camo.elchika.com/bbed19d1fed0eddc2cd12e8b87519470992cb15a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f34323434373165392d333164652d343035302d616363652d623434393836316462373332/) ぶ傾いいます。印刷時に厚とか調整したほうが良さそう![平面](https://camo.elchika.com/05c1c29ddef9770df06ec14767d955ecae436745/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f65376338653434652d363030382d343736662d623264632d336531636538386434643864/)

-

## データの整理 1. PIN_D16にロー、PIN_D17をハイにします。 2. パソコンでデータを吸い上げます。 3. 左が速さで縦が度数の分布グラフを作成しました。 ![散歩の速さの分布](https://camo.elchika.com/9b2730a2944bcf0b94906e8c2376d29a85e156f3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f64376131326238622d353435612d346561362d613435342d656666386436363163643433/) ## 考察 3つ山ができるとは予想外でした。正規分布すると思っていました。 # 実験2 1. 3Dプリンタで固定具を印刷して、減速機などを固定します。 2. 横棒の上にSPRESENSEなどを中心から15cm位の場所に固定します。

3. PIN_D16にハイ電圧、PIN_D17を浮かすはセーフ?(プルダウンの設定をしていたら?)

-

4. 表示が変わったら減速機に任意に電圧をかけます。今回は0.50Vかけした。 ![キャプションを入力できます](https://camo.elchika.com/7135fb392847fbc604d5a209a203f1c28dd53b4c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f30313461643232342d343062322d343134342d613965362d336430396461613865336366/)

+

4. 表示が変わったら減速機に任意に電圧をかけます。始動時は少し高めの電圧かけて、今回は0.25Vで下げてみました。

## データの整理 1. PIN_D16にロー、PIN_D17をハイにします。 2. パソコンでデータを吸い上げます。

-

![キャプションを入力できます](https://camo.elchika.com/c39d1f8991a86e09774da25e23cf056cf655c8d7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f66303833333333652d643537622d343033312d626238352d316264336564616632616661/)

+

![VS C#](https://camo.elchika.com/5b07935327096fe924f69891e0d6112219d6ad68/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f36663566326565642d363230662d343262312d616434322d333464633362363564376534/) ![表計算で加工中の雰囲気](https://camo.elchika.com/709987879d365edbb8547dbdfa1903919ce69340/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f34633636643765372d646363642d343436362d626564622d646663656237643730666466/)

-

3. グラフ化します。青が角度で左軸。赤が速さで右軸です。 ![キャプションを入力できます](https://camo.elchika.com/c412bef3a8a534812d21cc99522940b0cdd704a0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f64396561336533332d303663362d346261612d623039622d393962313434333564636661/)

+

3. 速さ分布図を作成してみました。 ![分布図](https://camo.elchika.com/67bb85d62e6656deef93f3c63425bb87c4e7770f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f66366537313461652d643937372d343936392d626166302d333334376165353063633961/)

-

4. 思い切って0を消したグラフを作成します。 ![キャプションを入力できます](https://camo.elchika.com/174310b479eab108a2856cc577e1b6e1ca1cf3fe/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f33323566313338662d636561632d343030622d613333302d363730666639336566376464/)

+

4. 時間のグラフを作成します。 ![キャプションを入力できます](https://camo.elchika.com/bde8907e90cead78ca2f63778f1c77cde865e013/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f33313938396562342d376138352d346630632d626461372d343934336639626665663961/)

## 考察

-

1. 青が速度で左の軸。橙が角度で右の軸です。300度越えから300度越えで16:35:17と16:35:22の5rpsとしてvは青線を線形近似した破線の0.8m/sにしよう。 $$v= 0.5[m/s]$$

+

1. グラフや表を整理していくと

$$r=0.15 [m]$$

-

$$\omega={\theta/t}=2\pi/5=1.256$$ $$r\omega=0.15{\times}1.256=0.18$$ 2. うーん。0m/sありだと。0.14m/s角度をみてると等速円運動に見ないのはなぜだろ。sin波みたくなると思ったのけど。ナイキシスト周波数っていのも考えないとダメなのかな。 `Gnss.setInterval(SpInterval_10Hz);`の位置はあっていのだろか。アドオンボートが必要のだろう? 3. 実験回数が少いです

+

$$\omega={\theta/t}=2\pi/4.5=1.4$$ $$r\omega=0.15{\times}1.4=0.21$$ 2. うーん。0m/sを消してみると。 ![キャプションを入力できます](https://camo.elchika.com/1977f63b563293bc08fb8cafb945b0a0c9d20438/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f30633366636365372d613364342d343335382d383832622d353630336636656536313139/) ![キャプションを入力できます](https://camo.elchika.com/5afd39c95f2452c796c61a0ed9ad790c66fa6565/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376136643031662d356135312d346338322d616134302d3338313839323334376536342f35656266666464642d356336652d343932392d393737652d386631353739643639343761/) 3. うーんような。電圧変てどなる。 `Gnss.setInterval(SpInterval_10Hz);`を変えとど

+

# 参考 [https://elchika.com/promotion/spresense2024/library/#nav](https://elchika.com/promotion/spresense2024/library/#nav) [https://developer.sony.com/spresense/development-guides/arduino_developer_guide_ja.html#_signalprocessing_%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA](https://developer.sony.com/spresense/development-guides/arduino_developer_guide_ja.html#_signalprocessing_%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)