개발자/Arduino

Arduino Nano 33 IoT 최강 가이드

지구빵집 2020. 11. 20. 11:12
반응형

 

 

Arduino Nano 33 IoT 최강 가이드 

 

본 가이드 원래 문서의 출처는 지금 보고 있는 이 링크를 따라가세요. 아직까지 Nano 33 IoT 보드가 국내에는 많이 알려지지 않았다는 게 신기합니다. 스마트 팩토리 프로젝트를 어제 끝냈습니다. 프린팅 장비의 상태와 주변 환경 데이터를 수집해 클라우드로 전송하는 장치에 Nano 33 IoT 보드를 사용했습니다. 아주 쉽게 됩니다. 시간도 얼마 걸리지 않고요. 큰돈은 되지 않았지만 몇 달은 일 안 하고 놀고 살아도 됩니다. 이런 게 정말 행복한 인생입니다. 빙고!

 

아뿔싸, 내용이 거의 같은 포스팅을 이전에 했었네요. 아! 좋아라. 더 자세히 알게 되었으니까요. 이젠 다 외우겠는데요. :)

 

이러한 상황에서 가장 잘 만들어진 문서와 제가 개발하면서 직접 알게 된 내용을 그것도 한국어로 작성하여 올리고 싶습니다. 외부 자료가 필요한 경우 개인적으로 직접 문서에 포함하는 방법을 선호합니다. 왜냐하면 데이터를 만들어내는 속도가 사라지는 속도와 비슷하기 때문입니다. 표시하기 어려운 데이터는 링크로 연결하고 가능한 한 원문의 글은 한글로 번역하여 직접 옮기고 제가 추가하는 사항을 별도로 표기하진 않습니다. 오늘도 즐겁게 개발하시는 모든 엔지니어에게 데모 귀신(잘 동작하는 장비도 데모만 하면 엉뚱하게 동작하도록 만드는 귀신)이 출몰하지 않는 연구실에서 아주 편안한 시간이 되시길 바랍니다.

 

이 가이드의 목적은 프로젝트에서 Arduino Nano 33 IoT를 사용하기 위한 주요 정보를 모으는 것입니다. 이 가이드를 작성할 당시 Arduino Nano 33 IoT는 시장에서 상당히 새롭고 인터넷에서 사용할 수 있는 정보가 많지 않았습니다. 나는 보드에 정보가 부족하여 약간 실망했고 여기에서 대부분의 통찰력은 실험에서 비롯된 것이기 때문에 이 가이드를 작성했습니다. 일부 정보는 다른 웹 사이트에서도 제공되며, 이 경우 해당 리소스는 섹션에서 언급됩니다. 

 

기억해야 할 중요한 사항 

 

공식 퀵 스타트 가이드는 아두 이노 웹 사이트에서 사용할 수 있습니다. Arduino Nano 33 IoT는 입력 및 출력 (IO 핀)에 3.3V 만 지원하며 대부분의 다른 Arduino 보드와 같이 5V를 허용하지 않습니다. IO 핀에 3.3V 이상을 연결하면 보드가 손상됩니다.

 

핀아웃은 고전적인 Arduino Nano 핀아웃과 호환됩니다. 클래식 5V 핀은 기본적으로 연결되어 있지 않으며 VUSB 점퍼를 연결하지 않으면 전원을 공급하지 않습니다.

 

핀 A4 및 A5에는 내부 풀업이 있으며 I2C 버스로 사용하도록 설계되었습니다. 따라서 A4 및 A5를 아날로그 입력으로 사용하지 않는 것이 좋습니다. 

 

비공식 Arduino Nano 33 IoT 핀아웃 다이어그램 

 

비공식 Arduino Nano 33 IoT 핀아웃 다이어그램 

 

유용한 자원 :

 

외부 인터럽트에 어떤 핀을 사용할 수 있습니까? 

 

아래 핀 attachInterrupt()은 Nano 33 IoT에서 사용할 수 있습니다. 

 

A1 15
A5 19
A7 21
D2 2
D3
D9 9
D10 10
D11 11

 

해당 정보를 아주 잘 정리한 사이트를 연결합니다, 참고하십시오. 자료는 역시 해당 링크에서 추출되었습니다. 

 

Arduino Nano 33 IoT에 전원을 공급하는 방법은 무엇입니까? 

 

박스에 따르면 Arduino Nano 33 IoT는 작동 전압이 3.3V 인 동안 USB 커넥터 (5V) 또는 Vin 핀 (4.5V-21V)을 통해 전원을 공급받을 수 있습니다. 그러나 공급 전압은 사용량에 따라 달라지는 것 같습니다. 이 이 주제에 대한 아두이노 포럼에서 토론을 참고하십시요.

 

전원 공급 장치 및 전압 당 피크 전류 소비에 관한 아래 실험 결과를 참조하십시오. 

 

 

아래 프로그램은 임베디드 모듈의 전력 소비를 테스트하는 데 사용되었습니다. 소스코드 1, 2, 3은 아래에 포함합니다.

  • 절전 : 워치 독을 사용하여 보드를 유휴 상태로 설정 (아래의 절전 방법 섹션 참조)
  • BareMinimum : 아두 이노 IDE의 내장 예제에 포함된 아무것도 하지 마십시오.
  • Blink : Arduino IDE 내장 예제에 포함된 내부 LED를 깜박입니다.
  • IMU_ShakeDetector : IMU를 사용하여 내부 LED (소스 코드 1)에서 가속 및 빛을 감지합니다.
  • Wifi_BasicScanNetworks : Wi-Fi를 사용하여 네트워크를 스캔하고 사용 가능한 네트워크가 있는 경우 내부 LED에 불이 들어옵니다 (소스 코드 2).
  • Wifi_HTTPS_GET : Wi-Fi를 사용하여 SSL이 활성화된 www.google.com 페이지를 가져오며 모든 것이 잘되면 내부 LED에 불이 들어옵니다 (소스 코드 3). 

소스코드 1

 

/*
  Arduino LSM6DS3 - Shake Detector
  This example reads the acceleration values from the LSM6DS3
  sensor and turn on the LED D13 when there is a shake of the 
  device.
  The circuit:
  - Arduino Uno WiFi Rev 2 or Arduino Nano 33 IoT
  created 9 Nov 2019
  by Olivier Staquet
  This example code is in the public domain.
*/

#include <Arduino_LSM6DS3.h>

void setup() {
  // Initialize embedded LED
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  delay(50);
  
  // Initialize IMU
  if (!IMU.begin()) {
    // Failed to initialize IMU, blink the internal LED
    while (1) {
      digitalWrite(13, HIGH);
      delay(100);
      digitalWrite(13, LOW);
      delay(100);
    }
  }
}

void loop() {
  float x, y, z;

  // Read acceleration values
  if (IMU.accelerationAvailable()) {
    IMU.readAcceleration(x, y, z);
    delay(5);
  }

  // If the shake is more than 3G, light on the LED for 1 second
  if(abs(x) > 3 || abs(y) > 3 || abs(z) > 3) {
    digitalWrite(13, HIGH);
    delay(1000);
    digitalWrite(13, LOW);
  }
}

 

소스코드 2

 

/*
  Arduino WifiNINA - Basic scan networks
  This example scans the network and blink the internal LED
  for one second if there is at least one network available.
  Circuit:
  * Board with NINA module (Arduino MKR WiFi 1010, MKR VIDOR 4000 and UNO WiFi Rev.2)
  created 9 Nov 2019
  by Olivier Staquet
*/


#include <WiFiNINA.h>

void setup() {
  // Initialize the internal LED
  pinMode(13, OUTPUT);
  
  // Check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    // If no module, don't continue and blink the LED
    while (true) {
      digitalWrite(13, LOW);
      delay(100);
      digitalWrite(13, HIGH);
      delay(100);
    }
  }
}

void loop() {
  // Scan for existing networks
  int numSsid = WiFi.scanNetworks();

  // If at least 1 network available, turn the LED on for 1 sec
  if(numSsid > 0) {
    digitalWrite(13, HIGH);
    delay(1000);
    digitalWrite(13, LOW);
  }
  
  delay(1000);
}

 

소스코드 3

 

/*
  Arduino WifiNINA - HTTP get over SSL
  This example connects to the network, try to connect to https://www.google.com 
  and blink the internal LED if we get the return code 200 and receive data
  Circuit:
  * Board with NINA module (Arduino MKR WiFi 1010, MKR VIDOR 4000 and UNO WiFi Rev.2)
  created 9 Nov 2019
  by Olivier Staquet
*/

#include "Connectivity.h"

void setup() {
  Serial.begin(115200);
  delay(5000);
  
  // Initialize the internal LED
  pinMode(13, OUTPUT);
  
  // Start the connectivity
  if (Connectivity.begin("your_network", "your_password", "8.8.8.8") != 0) {
    // If not OK, don't continue and blink the LED
    while (true) {
      digitalWrite(13, LOW);
      delay(100);
      digitalWrite(13, HIGH);
      delay(100);
    }
  }

  Connectivity.connect();
}

void loop() {
  uint8_t rc = Connectivity.get("www.google.com", "/", 5000);
  if(rc == 0) {
    digitalWrite(13, HIGH);
    delay(1000);
    digitalWrite(13, LOW);
  }
  delay(1000);
}

 

Arduino Nano 33 IoT에서 5V 핀을 활성화하는 방법은 무엇입니까? 

 

Arduino Nano 33 IoT에는 기본적으로 배선되지 않은 5V 핀이 있습니다. 프로젝트에 5V가 필요하고 USB를 통해 전원을 공급하는 경우 VUSB 점퍼를 연결하여 VUSB 핀에서 5V 전원 공급을 활성화할 수 있습니다. 이를 위해 보드에 VUSB 점퍼를 납땜하면 됩니다. 아래 이미지의 두 점퍼를 연결합니다.

 

 

이 핀을 통해 보드에 전원을 공급할 수 없다는 점에 유의하십시오. USB로 전원을 공급받는 외부 부품을 위한 편리한 5V 만 있으면 됩니다. USB 잭을 통해 보드에 전원을 공급하지 않으면이 핀에서 0V로 유지됩니다. 

 

Arduino Nano 33 IoT로 전력을 절약하는 방법은 무엇입니까? Arduino Nano 33 IoT로 전력을 절약하기 위해 권장되는 접근 방식이 있습니다.

 

  • 쓸모없는 모든 구성 요소 (Wifi, IMU ...)를 종료하고 마이크로 컨트롤러 (SAMD21G)를 절전 모드로 전환합니다. 이렇게 하면 절전 모드에서 6mA까지 내려갈 수 있습니다 (3.3V로 전원이 공급되는 경우). Arduino Nano 33 IoT를 절전 모드로 전환하는 방법을 참조하십시오. 방법 1에서 설명합니다. 소스코드를 포함합니다. 
  • RTC 클럭을 기반으로 전원을 끄고 웨이크 업합니다. 이렇게 하면 전원이 꺼져있는 동안 0mA로 내려가서 특정 시간 간격 (매분, 매시간 ...)으로 깨울 수 있습니다. Arduino Nano 33 IoT의 전원을 끄고 RTC를 사용하여 특정 시간에 깨우는 방법을 확인하세요. 방법 2에서 설명합니다. 

방법 1

 

수면으로 Arduino Nano 33 IoT로 전력을 절약하는 방법은 무엇입니까? Arduino Nano 33 IoT를 절전 모드로 전환하는 방법은 무엇입니까?

 

마이크로 컨트롤러로 전력을 절약하는 일반적인 방법은 절전 모드로 전환하고 워치 독을 사용하여 절전 모드를 해제하는 것입니다. 실제로 대부분의 전력은 마이크로 컨트롤러가 아무것도 하지 않는 동안 (즉, 두 샘플 사이에 대기) 소모됩니다. 이렇게 하면 수면 중에 마이크로 컨트롤러 수준에서 6mA까지 내려갈 수 있습니다 (3.3V로 전원이 공급되는 경우).

 

매우 인기 있는 저전력 라이브러리는 SAMD21G를 지원하지만 일부 패치를 적용한 후에 만 ​​가능합니다. 좋은 대안은 Adafruit SleepyDog 라이브러리를 사용하는 것입니다. Arduino IDE에 라이브러리를 설치하려면 Tools-> Manage Libraries... 메뉴로 이동하여 라이브러리 관리자에서 Adafruit SleepyDog Library를 검색하여 설치합니다. 

 

 

사용법은 매우 간단합니다. 

 

# include  < Adafruit_SleepyDog.h >

void  setup () {
   pinMode (LED_BUILTIN, OUTPUT);
  digitalWrite (LED_BUILTIN, HIGH);
}

무효  루프 () {
   digitalWrite (LED_BUILTIN, LOW); // 우리가 자고 있음을 보여줍니다.
  
  // 수면 
  감시. 수면 ();

  digitalWrite (LED_BUILTIN, HIGH); // 다시 깨어났다는 것을 보여줍니다. 
  delay ( 5000 );
}

 

Watchdog.sleep() 함수를 호출하게 되면 보드는 16초 동안 유휴 상태 가 되고 3.3V로 전원을 공급할 때 소비는 6mA까지 낮아집니다 (BareMinimum 프로그램의 경우 18mA보다 훨씬 낫습니다).

 

유일한 트릭은 보드에 새 프로그램을 업로드하려는 경우입니다. 보드가 Idle 상태일 때 USB 직렬을 수신하지 않기 때문에 새 프로그램을 업로드할 수 없습니다. 따라서 delay(5000) 성공적으로 업로드할 시간 슬롯을 갖기 위해 일부 활동 (실제 활동 또는 위와 같은 가짜 활동) 없이 프로그램을 업로드하지 마십시오. 즉 이 말은 프로그램을 로딩하기 위해 delay(5000); 같은 시간 벌기를 추가해 그 시간에 업로딩 하라는 이야기다. 

 

 

방법 2

 

전원을 끄고 RTC 알람을 활성화하여 Arduino Nano 33 IoT로 전력을 절약하는 방법은 무엇입니까? Arduino Nano 33 IoT의 전원을 끄고 RTC 클럭으로 특정 시간에 깨우는 방법은 무엇입니까?

 

대부분의 데이터 캡처 프로젝트에서 마이크로 컨트롤러는 아무것도 하지 않고 (대기 또는 수면) 엄청난 시간을 소비합니다. 이 수면 시간 동안 전력이 소모되고 배터리가 소모됩니다. 배터리로 몇 개월 / 년 동안 프로젝트를 유지하려면 수면주기 동안 전력 소비를 최소화하는 것이 가장 좋습니다.

 

여기에 설명한 방법은 다음과 같은 기능을 가지고 있습니다.

  • 절전 주기 동안 회로의 모든 전력을 차단합니다.
  • 미리 정의된 간격 (매분, 매시간, 매일 또는 특정 순간)으로 기상합니다.
  • RTC 클럭에 필요한 전력만 소비하십시오.

필요한 부품은 아래와 같습니다.

  • RTC DS3231 모듈 (Macetech의 ChronoDot 2.1을 사용하지만 INT 핀이 정상으로 연결된 모든 DS3231 모듈을 사용합니다)
  • NothernWidget 의 라이브러리 DS3231
  • 2x 커패시터 0.1mF
  • 2x 저항기 100KOhms
  • 1x NPN 트랜지스터 (BC547B 사용)
  • 1x MOSFET N 채널 (STP16NF06 사용)

 

회로도는 매우 간단합니다.  

 

 

이 회로를 브레드 보드에 재현하려면 아래 회로도를 참고하십시오.  

 

 

 

동작은 이해하기 쉽습니다.

 

  • Arduino Nano 33 IoT는 I2C 버스를 통해 RTC 클록을 조종하여 알람을 설정하고 알람을 해제합니다.
  • RTC 클록의 알람은 MOSFET의 전원을 열기 위해 NPN 트랜지스터를 조종하고 있습니다.
  • Arduino Nano 33 IoT는 MOSFET을 통해 전원이 공급됩니다.
  • 프로그램은 한 번만 실행되며 매번 setup()및 loop() 기능을 통해 이동합니다.

아래 프로그램은 다음을 수행합니다.

 

  • 시작 시 내장 LED를 3번 ​​빠르게 깜박입니다.
  • RTC의 알람을 1 분마다 깨우도록 설정합니다.
  • 내장 LED를 5 초 동안 깜박입니다.
  • 전원을 끄려면 알람을 해제하십시오. 
/****************************************************************************************
 * PowerOnTimer
 * ------------
 * Based on Arduino Nano IoT 33 and ChronoDot 2.1
 * By Olivier Staquet
 ***************************************************************************************/

// Libraries required
#include <Wire.h>
#include <DS3231.h>

// Global variables
DS3231 Clock;

/****************************************************************************************
 * Initialization
 ***************************************************************************************/
void setup() {
  // Wait 1 second (sometime, the wake-up is hard...)
  delay(1000);
  
  // Initialize LED
  pinMode(PIN_LED, OUTPUT);

  // On startup, blink 3 times fast...
  for(uint8_t i = 0; i < 3; i++) {
    digitalWrite(PIN_LED, HIGH);
    delay(100);
    digitalWrite(PIN_LED, LOW);
    delay(100);
  }

  // Start the I2C interface
  Wire.begin();

  // Alarm is not enabled! Should set alarm
  if(!Clock.checkAlarmEnabled(1))
  {
    Clock.setClockMode(false);
    // 0b1111 // each second
    // 0b1110 // Once per minute (when second matches)
    // 0b1100 // Once per hour (when minute and second matches)
    // 0b1000 // Once per day (when hour, minute and second matches)
    // 0b0000 // Once per month when date, hour, minute and second matches. Once per week if day of the week and A1Dy=true
    // Set alarm to happen every minute (change to your wanted interval)
    Clock.setA1Time(1, 1, 1, 0, 0b1110, false, false, false);
    Clock.turnOnAlarm(1);
  }

  // Empty the I2C buffer
  while(Wire.available()) {
    Wire.read();
  }
}

/****************************************************************************************
 * Main program
 ***************************************************************************************/
void loop() {
  // When waking-up, blink for 5 seconds
  for(uint8_t i = 0; i < 5; i++) {
    digitalWrite(PIN_LED, HIGH);
    delay(1000);
    digitalWrite(PIN_LED, LOW);
    delay(1000);
  }
  
  // Reset alarm to turn off the device
  Clock.checkIfAlarm(1);

  // Wait 10 seconds (if power down not wired)
  delay(10000);
}

 

Arduino Nano 33 IoT에서 Wi-Fi를 사용하는 방법은 무엇입니까? 

 

Arduino Nano 33 IoT에 내장된 Wifi 모듈은 인기 있는 NINA W102 ESP32 기반 모듈입니다. 2.4GHz 대역에서 Wifi 802.11 b / g / n 및 Bluetooth v4.2 (Bluetooth BR / EDR 및 Bluetooth Low Energy BLE)를 지원합니다. 이 모듈은 공식 WiFiNINA 라이브러리와 완벽하게 호환됩니다.

 

Arduino IDE에 공식 라이브러리를 설치하려면 Tools-> Manage Libraries... 메뉴로 이동하여 라이브러리 관리자에서 WiFiNINA를 검색하여 설치합니다. 

 

 

유용한 자원 :

Arduino Nano 33 IoT에서 관성 측정 장치 (IMU)를 사용하는 방법은 무엇입니까? 

 

Arduino Nano 33 IoT에 내장된 IMU는 LSM6DS3 입니다. 3 축 가속도계와 3 축 자이로 스코프로 구성됩니다. Arduino Nano 33 IoT의 LSM6DS3는 슬레이브 주소 0x6A의 I2C 버스를 통해 쉽게 사용할 수 있습니다.

 

IMU를 사용하기 위한 두 가지 편리한 라이브러리가 있습니다.

 

 

유용한 자원 : ST LSM6DS3의 데이터 시트

 

공식 Arduino LSM6DS3 라이브러리 (기본 사용법)

 

Arduino IDE에 공식 라이브러리를 설치하려면 Tools-> Manage Libraries ... 메뉴로 이동하여 라이브러리 관리자 LSM6DS3에서 Arduino_LSM6DS3by를 검색하여 설치합니다. 

 

 

사용법은 공식 Arduino 웹 사이트에 설명되어 있습니다.

 

라이브러리에서 간단한 프로그램을 사용할 수 있습니다.

  • 간단한 가속도계 - Simple Accelerometer 소스코드 추가
  • 간단한 자이로 스코프 - Simple Gyroscope 소스코드 추가

Simple Accelerometer

 

/*
  Arduino LSM6DS3 - Simple Accelerometer
  This example reads the acceleration values from the LSM6DS3
  sensor and continuously prints them to the Serial Monitor
  or Serial Plotter.
  The circuit:
  - Arduino Uno WiFi Rev 2 or Arduino Nano 33 IoT
  created 10 Jul 2019
  by Riccardo Rizzo
  This example code is in the public domain.
*/

#include <Arduino_LSM6DS3.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!IMU.begin()) {
    Serial.println("Failed to initialize IMU!");

    while (1);
  }

  Serial.print("Accelerometer sample rate = ");
  Serial.print(IMU.accelerationSampleRate());
  Serial.println(" Hz");
  Serial.println();
  Serial.println("Acceleration in G's");
  Serial.println("X\tY\tZ");
}

void loop() {
  float x, y, z;

  if (IMU.accelerationAvailable()) {
    IMU.readAcceleration(x, y, z);

    Serial.print(x);
    Serial.print('\t');
    Serial.print(y);
    Serial.print('\t');
    Serial.println(z);
  }
}

 

Simple Gyroscope

 

/*
  Arduino LSM6DS3 - Simple Gyroscope
  This example reads the gyroscope values from the LSM6DS3
  sensor and continuously prints them to the Serial Monitor
  or Serial Plotter.
  The circuit:
  - Arduino Uno WiFi Rev 2 or Arduino Nano 33 IoT
  created 10 Jul 2019
  by Riccardo Rizzo
  This example code is in the public domain.
*/

#include <Arduino_LSM6DS3.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!IMU.begin()) {
    Serial.println("Failed to initialize IMU!");

    while (1);
  }

  Serial.print("Gyroscope sample rate = ");
  Serial.print(IMU.gyroscopeSampleRate());
  Serial.println(" Hz");
  Serial.println();
  Serial.println("Gyroscope in degrees/second");
  Serial.println("X\tY\tZ");
}

void loop() {
  float x, y, z;

  if (IMU.gyroscopeAvailable()) {
    IMU.readGyroscope(x, y, z);

    Serial.print(x);
    Serial.print('\t');
    Serial.print(y);
    Serial.print('\t');
    Serial.println(z);
  }
}

 

 

Sparkfun LSM6DS3 라이브러리 (고급 사용)

 

Arduino IDE에 공식 라이브러리를 설치하려면 Tools- > Manage Libraries ... 메뉴로 이동하여 라이브러리 관리자 LSM6DS3에서 SparkFun LSM6DS3 Breakoutby를 검색하여 설치합니다. 

 

 

사용법은 라이브러리의 GitHub 페이지에 설명되어 있습니다. 이 라이브러리는 다음과 같은 고급 기능을 제공합니다.

 

  • I2C 채널 및 SPI에서 다중 인스턴스를 통한 사용.
  • 원시 값을 의미 있는 데이터로 변환하는 수학 함수가 있는 추가 드라이버.
  • 데이터 버스트 수집을 위한 내장 버퍼 사용

이 라이브러리를 사용할 때 I2C 주소를 0x6A로 변경하는 것을 잊지 마십시오.(기본적으로 SparkFun 모듈 주소는 0x6B). 미니멀한 예제의 변경 사항은 드라이버 초기화입니다. 아래 코드를 참고하시고 변경사항은 코드 아래에 있습니다.

 

/******************************************************************************
MinimalistExample.ino
Marshall Taylor @ SparkFun Electronics
May 20, 2015
https://github.com/sparkfun/LSM6DS3_Breakout
https://github.com/sparkfun/SparkFun_LSM6DS3_Arduino_Library
Description:
Most basic example of use.
Example using the LSM6DS3 with basic settings.  This sketch collects Gyro and
Accelerometer data every second, then presents it on the serial monitor.
Resources:
Uses Wire.h for i2c operation
Uses SPI.h for SPI operation
Either can be omitted if not used
Development environment specifics:
Arduino IDE 1.6.4
Teensy loader 1.23
Hardware connections:
Connect I2C SDA line to A4
Connect I2C SCL line to A5
Connect GND and 3.3v power to the IMU
This code is released under the [MIT License](http://opensource.org/licenses/MIT).
Please review the LICENSE.md file included with this example. If you have any questions 
or concerns with licensing, please contact techsupport@sparkfun.com.
Distributed as-is; no warranty is given.
******************************************************************************/

#include "SparkFunLSM6DS3.h"
#include "Wire.h"
#include "SPI.h"

LSM6DS3 myIMU; //Default constructor is I2C, addr 0x6B

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  delay(1000); //relax...
  Serial.println("Processor came out of reset.\n");
  
  //Call .begin() to configure the IMU
  myIMU.begin();
  
}


void loop()
{
  //Get all parameters
  Serial.print("\nAccelerometer:\n");
  Serial.print(" X = ");
  Serial.println(myIMU.readFloatAccelX(), 4);
  Serial.print(" Y = ");
  Serial.println(myIMU.readFloatAccelY(), 4);
  Serial.print(" Z = ");
  Serial.println(myIMU.readFloatAccelZ(), 4);

  Serial.print("\nGyroscope:\n");
  Serial.print(" X = ");
  Serial.println(myIMU.readFloatGyroX(), 4);
  Serial.print(" Y = ");
  Serial.println(myIMU.readFloatGyroY(), 4);
  Serial.print(" Z = ");
  Serial.println(myIMU.readFloatGyroZ(), 4);

  Serial.print("\nThermometer:\n");
  Serial.print(" Degrees C = ");
  Serial.println(myIMU.readTempC(), 4);
  Serial.print(" Degrees F = ");
  Serial.println(myIMU.readTempF(), 4);
  
  delay(1000);
}

 

라인 : LSM6DS3 myIMU;

 

다음으로 변경해야 합니다. LSM6DS3 myIMU(I2C_MODE, 0x6A); 

 

시리얼 통신은 어떻게 사용하나요? (왜 Arduino Nano 33 IoT에 SoftwareSerial.h가 없습니까?) 

 

전혀 없다. 필요하지 않기 때문에 아두이노 나노 33 IoT가 사용할 수 있는 SoftwareSerial.h는 없습니다. 이 보드는 훨씬 더 많은 기능을 제공합니다. 하드웨어 시리얼은 다른 핀을 씨리얼 통신으로 할당할 수 있습니다.

 

이 기능은 마이크로 컨트롤러 Atmel SAMD21G에서 제공하며 I / O 멀티플렉싱이라고 합니다. (자세한 내용은 Atmel SAM D21E / SAM D21G / SAM D21J 데이터 시트의 21 페이지 참조) 마이크로 컨트롤러는 거의 모든 핀에 할당할 수 있는 6 개의 SERCOM을 제공합니다.

 

일부 SERCOM은 이미 Arduino Nano 33 IoT에서 사용됩니다.

 

  • SPI NINA 용 SERCOM2
  • MOSI / MISO 용 SERCOM3
  • I2C 버스 용 SERCOM4
  • 직렬 디버깅 용 SERCOM5 (USB)

우리는 여전히 SERCOM0과 SERCOM1을 가지고 있습니다.

 

핀 할당에 대한 자세한 내용은 variant.cpp 및 variant.h파일에 설명되어 있습니다. Arduino는 오픈 소스이므로 SAMD 보드 용 GitHub 저장소에서 쉽게 찾을 수 있습니다.

 

Arduino Nano 33 IoT의 경우 핀 할당은 다음에 설명되어 있습니다.

을 읽고 variant.cpp핀 할당, 특히 SAMD 핀 (PAxx 또는 PBxx)과 Arduino 핀 사이의 링크를 이해합니다.

 

SAMD 핀은 데이터 시트 Atmel SAM D21E / SAM D21G / SAM D21J 의 PORT Function Multiplexing과 연결하는 데 중요합니다.

 

SERCOM은 클래식 또는 대체 일 수 있습니다. 데이터 시트에서 클래식은 C 열에 있고 대체는 D 열에 있습니다. SERCOM은 인덱스와 패드로 정의됩니다. 예 : SERCOM0/PAD [3] 이나 혹은 0.3 이라고 합니다.

 

비고 : 패드는 RX에 대해 0에서 3까지 정의되지만 TX는 0과 2에서만 정의됩니다. 사용할 핀을 선택할 때 중요한 고려 사항입니다. 참고로 할당할 SERCOM을 선택하는 데 사용한 표 아래를 참조하십시오. 

 

 

충분한 이론, 해결책을 찾으십시오. 

 

Arduino Nano 33 IoT의 핀 5 (RX) 및 6 (TX)에 하드웨어 직렬을 추가합니다. 

 

#include <Arduino.h>
#include "wiring_private.h"

Uart mySerial (&sercom0, 5, 6, SERCOM_RX_PAD_1, UART_TX_PAD_0);

// Attach the interrupt handler to the SERCOM
void SERCOM0_Handler()
{
    mySerial.IrqHandler();
}

void setup() {
  // Reassign pins 5 and 6 to SERCOM alt
  pinPeripheral(5, PIO_SERCOM_ALT);
  pinPeripheral(6, PIO_SERCOM_ALT);

  // Start my new hardware serial
  mySerial.begin(9600);
}

void loop() {
  // Do something with mySerial...
}

 

또 다른 예는 Arduino Nano 33 IoT의 핀 13 (RX) 및 8 (TX)에 하드웨어 직렬을 추가하는 것입니다. 

 

#include <Arduino.h>
#include "wiring_private.h"

Uart mySerial (&sercom1, 13, 8, SERCOM_RX_PAD_1, UART_TX_PAD_2);

// Attach the interrupt handler to the SERCOM
void SERCOM1_Handler()
{
    mySerial.IrqHandler();
}

void setup() {
  // Reassign pins 13 and 8 to SERCOM (not alt this time)
  pinPeripheral(13, PIO_SERCOM);
  pinPeripheral(8, PIO_SERCOM);

  // Start my new hardware serial
  mySerial.begin(9600);
}

void loop() {
  // Do something with mySerial...
}

 

여기까지 정리는 다 했고 프로젝트 수행하면서 발견한 사항들을 첨부하기로 하고 놀러 나간다. 오늘 놀아야 할 것을 내일로 미루지 말고, 내일 놀아야 할 것을 오늘로 당겨 놀지도 말아야 합니다. :)

 

 

 

 

반응형