ããã«ã¡ã¯ãENGããŽã§ãã
Arduino UNO R4 WiFiã®SDã©ã€ãã©ãªã䜿çšãããšSDã«ãŒããæäœããŠããŒã¿ã®èªã¿æžããã§ããŸããArduino UNOã®æ¡åŒµåºæ¿ã§ããSD CARD SHIELDã䜿ã£ãŠSDã«ãŒããæäœããæ¹æ³ããŸãšããŸããã
SDã©ã€ãã©ãªã®äœ¿çšäŸãšããŠå°ç£æ°ã»ã³ãµãŒïŒBM1422ïŒããååŸããããŒã¿ãSDã«ãŒãã«ä¿åããŠåäœç¢ºèªãè¡ããŸããã
SD CARD SHIELDã¯ã¢ã€ãã£ããç»åã®ããã«Arduino UNOã«å·®ã蟌ãã ãã§äœ¿çšããããšãã§ããŸããå°ç£æ°ã»ã³ãµãŒã¢ãžã¥ãŒã«ã«AE-BM1422AGMVïŒç§æé»åïŒã䜿çšããŠããŸãã
以äžã§ã¯Arduino UNO R4 WiFiãUNOR4-WiFiãšè¡šèšããŸããArduinoã®ã©ã€ãã©ãªã䜿çšããŠåäœç¢ºèªããããšããŸãšããŠããŸãã
Arduinoã§åŠã¹ããã€ã³ã³ã®ãœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
SDã©ã€ãã©ãªã䜿çšãã
UNOR4-WiFiã¯Arduino UNOã«æºæ ããŠããããArduinoç°å¢ã®SDã©ã€ãã©ãªã䜿çšããããšãã§ããŸããSDã©ã€ãã©ãªã¯SPIéä¿¡ã䜿ã£ãŠSDã«ãŒããæäœããŸãã
SDã©ã€ãã©ãªã®ã€ã³ã¯ã«ãŒããããåæåã®æ¹æ³ãšãã¡ã€ã«ã®äœææ¹æ³ãããŒã¿ã®æžãèŸŒã¿æ¹æ³ã説æããŸãã
SDã¯ã©ã¹ã®ã¡ã³ããŒé¢æ°ãšFileã¯ã©ã¹ã®ã¡ã³ããŒé¢æ°ãèµ€æåã§èšèŒããŸãã
ã©ã€ãã©ãªã®æºåãšåæå
#include <SD.h>
#define SD_CS 4
File myfile; //SDã«ãŒãã®ç¶æ
ãæ ŒçŽæ°å€æ°
void setup() {
if(!SD.begin(SD_CS)){
Serial.println("initialization failed!");
while (1);
}
}
SDã«ãŒãã®æäœããããã«SD.hãã€ã³ã¯ã«ãŒãããå¿ èŠããããŸããSPIéä¿¡ã䜿çšããŸãããSDã©ã€ãã©ãªå ã§SPIéä¿¡ã®åæèšå®ãªã©ãè¡ãããŸãã
SDã«ãŒãã®ç¶æ ã管çããããFileåã®ã¯ã©ã¹å€æ°ã®å€æ°ãã€ã³ã¹ã¿ã³ã¹åããŸããäŸã§ã¯myfileã宣èšããŠã€ã³ã¹ã¿ã³ã¹åããŠããŸãããã®myfileã䜿ã£ãŠSDã«ãŒãã®æäœã«é¢ããæ å ±ã®ç®¡çãè¡ããŸãã
SDã©ã€ãã©ãªã®begin()颿°ã§åæåãè¡ããŸããåŒæ°ã«ã¯SDã«ãŒããéžæããããã®ã¹ã¬ãŒãã»ã¬ã¯ãïŒCSïŒã®ãã³çªå·ãæå®ããŸããSD CARD SHIELDã¯4ãã³ãã¹ã¬ãŒãã»ã¬ã¯ãã«ãªãããã«èšèšãããŠããã®ã§4ãã³ãåŒæ°ã§æå®ããŸãã
SDã«ãŒããæ¿å ¥ãããŠããªããªã©åæåã«å€±æããå Žåãæ»ãå€ãfalseã«ãªããŸããåæåã«å€±æãããšSDã«ãŒãã®æäœãè¡ããªãã®ã§éã®åŠçã«é²ãŸãªãããã«while(1)ã§ç¡éã«ãŒãããããã«ããŠããŸãã
SDã«ãŒãã®ãã¡ã€ã«ãåé€
String filepath = "bm1422.txt"; //SDã«ãŒãå
ã«ä¿åãããã¡ã€ã«å
if (SD.exists(filepath)) {
Serial.println("file exists.");
SD.remove(filepath); //ãã¡ã€ã«ãåé€
Serial.println("file delete");
}
else{
Serial.println("file doesn't exist.");
}
BM1422ããååŸããããŒã¿ã¯é»æºONããã®æéãšãªããããã¡ã€ã«ãæ®ã£ãç¶æ ã§æžã蟌ããšè¿œå ããŠããŒã¿ãæžã蟌ãããããã€ã®ããŒã¿ãåãããªããªããŸãããã®ãããã¡ã€ã«ãååšããŠããå Žåã¯ãexists()颿°ã§åé€ããããã«ããŸããåŒæ°ã«ã¯éããã¡ã€ã«åãå«ãããã¹ãæå®ããŸãã
ãã¡ã€ã«ãååšããå Žåã¯remove()颿°ã§ãã¡ã€ã«ãåé€ããŸããåŒæ°ã«åŒæ°ã«ã¯éããã¡ã€ã«åãå«ãããã¹ãæå®ããŸãã
PRïŒæè¡ç³»ã®éä¿¡æè²è¬åº§ãªãJTEX
SDã«ãŒãã«ããŒã¿ãæžã蟌ã
myfile = SD.open(filepath,FILE_WRITE);
if( myfile ){ //ãã¡ã€ã«ãéãããæžã蟌ã
myfile.print("X:"); myfile.print(mag[0]); myfile.print(",");
myfile.print("Y:"); myfile.print(mag[1]); myfile.print(",");
myfile.print("Z:"); myfile.print(mag[2]); myfile.println("");
myfile.close(); //ãã¡ã€ã«ãéãã
}
open()颿°ã§ãã¡ã€ã«ãæžã蟌ã¿ã¢ãŒãã§éããŸãã第1åŒæ°ã«ã¯ãã¡ã€ã«ã®ãã¹ãæå®ãã第2åŒæ°ã«æžã蟌ã¿ã瀺ãFILE_WRITEãæå®ããŸãã
ãã¡ã€ã«ã®æ å ±ãæ»ãå€ã«ã»ãããããã®ã§myfileïŒFileã¯ã©ã¹ã§ã€ã³ã¹ã¿ã³ã¹åïŒã«æ ŒçŽããŸãã以éã®ãã¡ã€ã«ã®æžã蟌ã¿ã¯myfileã䜿ã£ãŠè¡ããŸãã
ãã¡ã€ã«ãéããŠprint()颿°ã§æžã蟌ã¿ãŸããwrite()颿°ã䜿çšããŠãããŒã¿ã®æžã蟌ã¿ã¯ã§ããŸãããæååãæžã蟌ãå Žåã¯print()颿°ã®æ¹ãå¹çããåŠçã§ããŸãã
X:ã®æååãšBM1422ããååŸããããŒã¿(mag[0])ãæžã蟌ãã§ããŸããããŒã¿ã®åºåããšããŠãïŒããå ¥ããŠããŸãããããYïŒãZ:ãš3èŠçŽ åæžã蟌ã¿ãŸãã
æåŸã«ãã¡ã€ã«ãéããããclose()颿°ã䜿çšããŸãã
SDã«ãŒãæäœã«äœ¿çšãã颿°
SDã«ãŒãã®æäœã«é »ç¹ã«äœ¿çšãã颿°ããŸãšããŸããã
| 颿° | 説æ |
|---|---|
| Read() Read(åŒæ°1,åŒæ°2)ããããããããããããããããã | SDã«ãŒãã®ããŒã¿ãèªã¿èŸŒã¿ãŸãã1ãã€ããã€èªã¿èŸŒãå Žåã¯Read()ã䜿çšããŸããè€æ°ãã€ãããŸãšããŠèªã¿èŸŒãå Žåã¯Read(åŒæ°1,åŒæ°2)ã䜿çšããŸããåŒæ°1ã¯èªã¿èŸŒãã ããŒã¿ãæ ŒçŽããé åãªã©ã®ã¢ãã¬ã¹ãåŒæ°2ã¯èªã¿åºãããŒã¿æ°ãæå®ããŸãã |
| ReadStringUntil(åŒæ°) | åŒæ°ã«æå®ããæåã確èªãããŸã§æååãšããŠèªã¿èŸŒã¿ãŸããæ¹è¡ã³ãŒããåºåãã«ããå Žå㯒\n’ãæå®ããŸãã |
| remove(åŒæ°) | åŒæ°ã§æå®ãããã¡ã€ã«ãåé€ããŸãã |
| mkdir(åŒæ°) rmdir(åŒæ°) | mkdir()ã¯åŒæ°ã«æå®ããSDã«ãŒãã®ãã¹ã«ãã£ã¬ã¯ããªãçæããŸããrmdir()ã¯æå®ãããã£ã¬ã¯ããªãåé€ããŸãããã ããã¡ã€ã«çãããå Žåã¯åé€äžå¯ãšãªããŸãã |
| write(åŒæ°) write(åŒæ°1,åŒæ°2) | 1ãã€ããã€æžã蟌ãå Žåã¯write()ã䜿çšããŸããåŒæ°ã«æžã蟌ãããŒã¿ãæå®ããŸããè€æ°ãã€ããäžæ°ã«æžã蟌ãå Žåã¯write(åŒæ°1,åŒæ°2)ã䜿çšããŸããåŒæ°1ã¯æžã蟌ãå€ãæ ŒçŽããŠããé åãªã©ã®ã¢ãã¬ã¹ãåŒæ°2ã¯æžã蟌ããµã€ãºãæå®ããŸãã |
| print(åŒæ°) println(åŒæ°) | åŒæ°ã«æååãæ ŒçŽããŠããé åãªã©ã®ã¢ãã¬ã¹ãæå®ããŸããçŽæ¥æååãå ¥åããããšãã§ããŸããprintln()颿°ã䜿çšãããšæååã®æåŸå°Ÿã«æ¹è¡ã³ãŒããæ¿å ¥ãããŸãã |
ããã¹ãããŒã¿ã§ä¿åãããšæååã§ããŒã¿ãä¿åããããã確èªããããããªããŸããprint()颿°ã¯æååã§æžã蟌ããã䜿çšé »åºŠãå€ããªããŸãããŸãããã¹ãããŒã¿ã®åºåãã倿ããããæ¹è¡ã³ãŒãã䜿çšããããšãå€ãããReadStringUntil()颿°ã䜿çšããé »åºŠãå€ããªãå°è±¡ã§ãã
åäœç¢ºèª

SD CARD SHILDãUNOR4-WiFiã«æ¿å ¥ããŠåäœç¢ºèªãè¡ããŸãã
BM1422ã¯SD CARD SHILDã®Wireã®ãã³ã«é ç·ããŠããŸããSD CARD SHILDã¯UNOR4-WiFiã®ãã³ãå»¶é·ããŠããã ããªã®ã§é ç·ã¯åãã§ãã
BM1422ãæž¬å®ããçµæãSDã«ãŒãã«ä¿åããŸãããã·ãªã¢ã«ãããã¿ã®çµæãšæ¯èŒããŠåäœç¢ºèªãè¡ããŸããã
ã·ãªã¢ã«ãããã¿ãéå§ããŠé»æºãå ¥ããŸããBM1422ã®æž¬å®ã1ç§ããšã«è¡ããæž¬å®çµæãSDã«ãŒãã«æžã蟌ã¿ãŸãã

BM1422ã«ç£ç³ãè¿ã¥ãããåããå€ãããããªããæž¬å®çµæã確èªããŸãããæ¬¡ã«é»æºãåã£ãŠSDã«ãŒããåãåºããŠãã¡ã€ã«ã確èªããŸããã

ãBM1422.TXTããçæãããŠããããšã確èªã§ããŸãããæŽæ°æ¥æãããã©ã«ãã®æå»ã«ãªã£ãŠããŸããããã¡ã€ã«ãäžåºŠéããŠäžæžããããšæŽæ°æ¥æã衚瀺ãããããã«ãªããŸãã

ãã¡ã€ã«ãéããšBM1422ããååŸãã軞ã軞ã軞ã®ããŒã¿ãä¿åãããŠããããšã確èªã§ããŸããã
ãã®ãã¡ã€ã«ã®æ¡åŒµåãã.csvãã«å€æŽããšã¯ã»ã«ã§ã°ã©ã衚瀺çšã®ããŒã¿ã«å å·¥ããŠã°ã©ãåããŸããã

èµ€æ éšåã¯ã·ãªã¢ã«ãããã¿ã®è¡šç€ºéšåãšåäžã®ç®æã§ããèŠãç®ã§äžèŽããŠããããšã確èªã§ããŸããã
ãœãŒã¹ã³ãŒãå šäœ
ãœãŒã¹ã³ãŒãã¯èšäºäœææç¹ã«ãããŠåäœç¢ºèªã§ããŠããŸããã䜿çšããŠããã©ã€ãã©ãªã®æŽæ°ã«ããåäœãä¿èšŒã§ããªããªãå¯èœæ§ããããŸãããŸãããœãŒã¹ã³ãŒãã䜿çšããããšã«ãã£ãŠçããäžå©çãªã©ã®äžåã®è²¬ä»»ãè² ããããŸããåèè³æãšããŠã䜿ããã ããã
#include <Wire.h>
#include <SD.h>
#define TIME_OFF -1 //ã¿ã€ããŒã䜿çšããªãå Žå
#define TIME_UP 0 //ã¿ã€ã ã¢ãã
#define BASE_CNT 10 //ããŒã¹ã¿ã€ãã«ãŠã³ãå€
#define TIME_BM1422 100 //BM1422ã®èšæž¬ã¿ã€ã
#define TIME_OUT 20 //BM1422ã®éä¿¡ã¿ã€ã ã¢ãŠã
#define TIME_LED 50
#define BM1422_ADRS 0x0E
#define CTRL1_ADRS 0x1B
#define CTRL2_ADRS 0x1C
#define CTRL3_ADRS 0x1D
#define CTRL4_ADRS 0x5C
#define CTRL4_ADRS2 0x5D
#define STA1_ADRS 0x18
#define DATA_ADRS 0x10
#define CTRL1_SET 0xC2
#define CTRL2_SET 0x0C //æªäœ¿çš
#define CTRL3_SET 0x40
#define CTRL4_SET 0x00
#define SD_CS 4
typedef enum{
BM1422_STEP1 = 0,
BM1422_STEP2,
BM1422_STEP3,
BM1422_STEP4,
BM1422_STEP5,
BM1422_IDLE,
BM1422_MAX
}BM1422_MODE;
uint32_t beforetimCnt = millis();
int16_t timbm1422;
int16_t timled;
int16_t timMeas;
BM1422_MODE md;
uint8_t cmadbuf[3]; //éä¿¡ããããŒã¿ãæ ŒçŽ
uint8_t mdata[6]; //枬å®ããŒã¿æç®å
float mag[3]; //æç®åŸããŒã¿
String filepath = "bm1422.txt";
File myfile;
void mainApp(void);
void mainTimer(void);
bool BM1422Cmd(uint8_t* cmd, uint8_t len);
bool BM1422GetData(uint8_t adr, uint8_t* reg_data, uint16_t len);
void MagSet(void);
void setup() {
Serial.begin(115200);
Wire.begin();
if(!SD.begin(SD_CS)){
Serial.println("initialization failed!");
while (1);
}
Serial.println("initialization done.");
if (SD.exists(filepath)) {
Serial.println("file exists.");
SD.remove(filepath); //ãã¡ã€ã«ãåé€
Serial.println("file delete");
}
else{
Serial.println("file doesn't exist.");
}
}
void loop() {
mainTimer();
mainApp();
}
/* ã¿ã€ã管ç */
void mainTimer(void){
if ( millis() - beforetimCnt > BASE_CNT ){
beforetimCnt = millis();
if( timbm1422 > TIME_UP ){
--timbm1422;
}
if( timled > TIME_UP ){
--timled;
}
if( timMeas > TIME_UP ){
--timMeas;
}
}
}
/* ã¡ã€ã³åŠç */
void mainApp(void){
switch(md){
case BM1422_STEP1:
cmadbuf[0] = CTRL1_ADRS;
cmadbuf[1] = CTRL1_SET;
if( BM1422Cmd(cmadbuf, 2)){
timbm1422 = TIME_OUT;
md = BM1422_STEP2;
}
else{
Serial.println("STEP1 NG");
}
break;
case BM1422_STEP2:
if( timbm1422 == TIME_UP ){
cmadbuf[0] = CTRL4_ADRS;
cmadbuf[1] = CTRL4_SET;
cmadbuf[2] = CTRL4_SET;
if( BM1422Cmd(cmadbuf, 3) ){
timbm1422 = TIME_OUT;
md = BM1422_STEP3;
}
else{
Serial.println("STEP2 NG");
}
}
break;
case BM1422_STEP3: //ããŒã¿æž¬å®éå§
if( timbm1422 == TIME_UP ){
cmadbuf[0] = CTRL3_ADRS;
cmadbuf[1] = CTRL3_SET;
if( BM1422Cmd(cmadbuf, 2 )){
timbm1422 = TIME_OUT;
md = BM1422_STEP4;
}
else{
Serial.println("STEP3 NG");
}
}
break;
case BM1422_STEP4:
if( timbm1422 == TIME_UP ){
timbm1422 = TIME_OUT;
uint8_t sta;
BM1422GetData(STA1_ADRS, &sta, 1);
if( sta &= 0x40 ){
md = BM1422_STEP5;
//Serial.println("Measure OK");
}
}
break;
case BM1422_STEP5:
if( timbm1422 == TIME_UP ){
timbm1422 = TIME_OUT;
BM1422GetData(DATA_ADRS, mdata, sizeof(mdata));
MagSet();
md = BM1422_IDLE;
timMeas = TIME_BM1422;
}
break;
case BM1422_IDLE:
if( timMeas == TIME_UP ){
timMeas = TIME_OFF;
md = BM1422_STEP3;
}
break;
}
if( timled == TIME_UP ){
timled = TIME_LED;
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
}
/* ç£æ°ã»ã³ãµãŒã®å€ãæç® */
void MagSet(void){
int16_t x;
int16_t y;
int16_t z;
x = (mdata[1] << 8) + mdata[0];
y = (mdata[3] << 8) + mdata[2];
z = (mdata[5] << 8) + mdata[4];
mag[0] = (float)x * 0.042;
mag[1] = (float)y * 0.042;
mag[2] = (float)z * 0.042;
Serial.print("X:"); Serial.print(mag[0]); Serial.print(",");
Serial.print("Y:"); Serial.print(mag[1]); Serial.print(",");
Serial.print("Z:"); Serial.print(mag[2]); Serial.println("");
myfile = SD.open(filepath,FILE_WRITE);
if( myfile ){ //ãã¡ã€ã«ãéãããæžã蟌ã
myfile.print("X:"); myfile.print(mag[0]); myfile.print(",");
myfile.print("Y:"); myfile.print(mag[1]); myfile.print(",");
myfile.print("Z:"); myfile.print(mag[2]); myfile.println("");
myfile.close(); //ãã¡ã€ã«ãéãã
}
}
/* ã³ãã³ãéåº */
bool BM1422Cmd(uint8_t* cmd, uint8_t len){
bool ret = false;
Wire.beginTransmission(BM1422_ADRS); //ã¹ã¬ãŒããååšããã確èª
byte error = Wire.endTransmission();
if( error == 0){ //ã¹ã¬ãŒããååšããå Žåäžã®åŠç
Wire.beginTransmission(BM1422_ADRS);
for(uint8_t i= 0; i < len; i++ ){
Wire.write(*cmd);
++cmd;
}
Wire.endTransmission(); //ã¹ãããã»ã³ã³ãã£ã·ã§ã³ã®çºè¡
ret = true;
}
return ret;
}
/* ããŒã¿ãååŸ */
bool BM1422GetData(uint8_t adr, uint8_t* reg_data, uint16_t len){
bool ret = false;
Wire.beginTransmission(BM1422_ADRS); //ã¹ã¿ãŒãã»ã³ã³ãã£ã·ã§ã³ã®çºè¡
Wire.write(adr); //æžã蟌ã察象ã®ã¢ãã¬ã¹ãã»ãã(ã©ã€ãã§æå®)
byte error = Wire.endTransmission();
if( error == 0){ //ã¹ã¬ãŒããååšããå Žåäžã®åŠç
if( Wire.requestFrom(BM1422_ADRS, len) == len ){
for( uint16_t i=0; i < len; i++ ){
*reg_data = Wire.read(); //lenåã ãããŒã¿ããªãŒããã
++reg_data;
}
ret = true;
}
}
return ret;
}
é¢é£ãªã³ã¯
Arduinoã®ã©ã€ãã©ãªã䜿ã£ãŠåäœç¢ºèªãè¡ã£ãããšãäžèšãªã³ã¯ã«ãŸãšããŠããŸãã
Arduinoã§åŠã¹ããã€ã³ã³ã®ãœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
Seeeduino XIAOã§åŠã¹ããœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
ESP32-WROOM-32Eã§åŠã¹ããœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
Raspberry Pi Picoã§åŠã¹ããœããéçº
PRïŒå€è³ç³»ã»ITæ¥çãªã©ãã€ã¯ã©ã¹ã®è»¢è·ã«åŒ·ããAXIS Agentã
æåŸãŸã§ãèªãã§ããã ãããããšãããããŸããã

RTCã§æå»ãèšå®ããåŸã§ãæå»ãå«ããŠããŒã¿ãä¿åãããšãã¡ã€ã«ãåé€ããå¿ èŠã¯ãããŸãããããã¡ã€ã«ã®æ®ãæ¹ã¯å¥œã¿ã«ãªããŸãã