Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

Arduinoでsprintfを使い文字列を生成する

Arduinoで文字列を作るときはStringクラスが使えますが
速度を高速化したい、既成のsprintfを利用したC言語プロジェクトを流用したいなどのケースでは
標準でsprintf関数を利用することができます。

実際のところ

GPSと加速度を模したデータを一つの文字列として出力したい場合、以下のようにします。
要素ごとにprintfするよりは高速化できます。

void setup() {
  Serial.begin(9600);
  
  char buf[60];
  int val1 = -12;
  int val2 = 987;
  int year = 2020;
  int month = 6;
  int day = 2;
  int hour = 9;
  int minute = 30;
  int second = 8;
  long latitude    = 1111111;
  long longitude = 2222222;
  int x = 379;
  int y = 297;
  int z = 346;

  sprintf(buf, "%4d-%02d-%02dT%02d:%02d:%02dZ", year, month, day, 
                                               hour, minute, second );
  sprintf(buf, "%s,%ld,%ld", buf, latitude,longitude );
  sprintf(buf, "%s,%d,%d,%d", buf, x,y,z );
  
  Serial.println(buf);
}

void loop() {

}

参考もと

garchiving.com

OpenLogで手間なくロギングを行う

F9Pと同様、QWIICシステムをつかいます。
f:id:shuzo_kino:20200602235221p:plain
公式より引用

実際のところ

試してみる

簡易的に、ディレクトリ直下のAppendMe,txtに値を書いてみます。

#include <Wire.h>
#include "SparkFun_Qwiic_OpenLog_Arduino_Library.h"
OpenLog myLog; //Create instance


const byte OpenLogAddress = 42; //Default Qwiic OpenLog I2C address

void setup()
{
  Wire.begin();
  myLog.begin(); //Open connection to OpenLog (no pun intended)

  Serial.begin(9600); //9600bps is used for debug statements
  Serial.println("12,");
  myLog.println("24");
  myLog.syncFile();

  Serial.println("Done!");
}

void loop()
{

}

上記のスクリプトを書き込み、起動後リセットボタンを一回おして、合計二回書き込まれるようにします。
すると……?

SDカードを移し替えてファイルをみると……

$ cat appendMe.txt
12,24
$

参考もと

github.com

三軸加速度センサADXL335をArduinoで使う

f:id:shuzo_kino:20200602000004p:plain
画像はsparkfun公式より引用

先日のGPSに続いて、今度は三軸加速度を使っていきます。
今回選定したsparkfun社のADXL335は出力がアナログで出てくるタイプのボードです。
ピンは喰いますが、あとで回路的に細工ができるメリットがあります。

実際のところ

int x, y, z;

void setup()
{
  Serial.begin(115200);      // sets the serial port to 9600
}

void loop()
{
  x =  (analogRead(A0));
  y =  (analogRead(A1));
  z =  (analogRead(A2));


  Serial.print(x);    
  Serial.print(",");    
  Serial.print(y);   
  Serial.print(",");  
  Serial.println(z); 
  delay(500);    
}

STEM教育まわりでネタがないなら、Arduino公式のProjectHubをみるとネタがあるかも?

公式にそういうサイトがあるのは把握してたのですが、
なんか見ないうちにかなり充実してたのでメモ。
create.arduino.cc

Arduino公式にあるProjectHubはMakers*1が作った作例が集積されており、
特にmotors-roboticsの項目は小型ロボット事例の宝庫です。
エレベーターとか小型自販機とか、どことなくニコニコ技術部のノリを感じますね。

最低限の英語を読める必要がありますが、詳しい記事は写真や図面、動画がついてるので資料も作りやすそう。

蛇足

基準も中々にカオスで、本ブログでも紹介したIonoシリーズのArduino版をつかってMincraftの挙動と実世界をリンクさせるという奇怪なプロジェクトもあります。
似た事例はSalesforceで見たことがありましたが、実世界介入は中々アツいですね……。
create.arduino.cc

*1:なんか最近死語になりつつある

【読書メモ】ウィガン波止場への道

動物農場や1984などで著名な作家ジョージ・オーウェル氏による、1937年当時の下層階級体当たりルポと、それをうけた論評の本です。

下層階級への同情を表面上装っておきながら、当事者との直接交流を取る気がない口先だけの似非リベラルと異なり、
オーウェル氏は社会主義者を自認しつつも、そういった輩とは一線を画しスペイン内戦時に国際旅団で血と汗を流す*1行動派です。
いまでいう3K(くさい、きたない、きつい)労働に従事している人々にインテリである彼が抱いた率直な感想が綴られているわけですが、その行動様式は個別のツールを変えれば現代でも大して変わってないように見えます。

最後の章「私の提案」では、作中に描写された惨状がありながら社会主義が受け入れられていない現状ついて著者の考察と提案にて締め括られています。
社会主義が普及段階故に程度の低い輩が幅を利かせ、それが外部からの偏見を強化しているとう件は、これまで私が革新派に抱いていた不信感を言語化してくれていました。

類似した本では、ヴィクトリア朝時代の下層階級体当たりルポである「ロンドン貧乏物語―ヴィクトリア時代 呼売商人の生活誌」も中々。
shuzo-kino.hateblo.jp

*1:実際、喉に直撃を喰らい死にかけている

高機能なGPSモジュールZED F9Pをつかう その3:Arduinoでつかう

RasPiでPythonという方法のほかに、Arduinoでやる手もあります。

実際のところ

Qwiicコネクタを経由した構成はこんな感じ。


導入はIDEなら楽々。
f:id:shuzo_kino:20200529023001p:plain


SparkFun_Ublox_Arduino_Library/Example1_GetPositionAccuracy.ino at master · sparkfun/SparkFun_Ublox_Arduino_Library · GitHub
をそのまんま写経

#include <Wire.h> //Needed for I2C to GPS

#include "SparkFun_Ublox_Arduino_Library.h" //http://librarymanager/All#SparkFun_Ublox_GPS
SFE_UBLOX_GPS myGPS;

long lastTime = 0; //Simple local timer. Limits amount if I2C traffic to Ublox module.

void setup()
{
  Serial.begin(115200);
  while (!Serial); //Wait for user to open terminal
  Serial.println("SparkFun Ublox Example");

  Wire.begin();

  if (myGPS.begin() == false) //Connect to the Ublox module using Wire port
  {
    Serial.println(F("Ublox GPS not detected at default I2C address. Please check wiring. Freezing."));
    while (1);
  }

  myGPS.setI2COutput(COM_TYPE_UBX); //Set the I2C port to output UBX only (turn off NMEA noise)
  myGPS.saveConfiguration(); //Save the current settings to flash and BBR
}

void loop()
{
  //Query module only every second. Doing it more often will just cause I2C traffic.
  //The module only responds when a new position is available
  if (millis() - lastTime > 1000)
  {
    lastTime = millis(); //Update the timer

    long latitude = myGPS.getLatitude();
    Serial.print(F("Lat: "));
    Serial.print(latitude);

    long longitude = myGPS.getLongitude();
    Serial.print(F(" Long: "));
    Serial.print(longitude);
    Serial.print(F(" (degrees * 10^-7)"));

    long altitude = myGPS.getAltitude();
    Serial.print(F(" Alt: "));
    Serial.print(altitude);
    Serial.print(F(" (mm)"));

    long accuracy = myGPS.getPositionAccuracy();
    Serial.print(F(" 3D Positional Accuracy: "));
    Serial.print(accuracy);
    Serial.println(F("mm"));
  }

}

出力結果はこんな塩梅

SparkFun Ublox Example
Lat: xxxxxxxxxx Long: yyyyyyyyyy (degrees * 10^-7) Alt: 44805 (mm) 3D Positional Accuracy: 2766mm

下7ケタで小数点をうってやると、座標変換できます。
私は数値があまりに正確すぎて禿げました。
https://www.openstreetmap.org/?mlat=xx.xxxxxxx&mlon=yyy.yyyyyyy&zoom=20

参考もと

github.com