Embedded Lecture/Arduino2017. 3. 18. 14:53


USART와 같은 시리얼 통신이 1:1 통신 규약인 반면, TWI(I2C)는 1:n 통신 규약으로 하나의 마스터(master) 기기가 여러 개의 슬레이브(slave) 디바이스들과 통신을 할 수 있다는 장점이 있습니다. Wire 라이브러리는 아두이노의 표준 라이브러리로서 Arduino IDE에 기본으로 내장되어 있습니다. 따라서 아두이노로 TWI 통신을 위해서는 다음의 Wire 라이브러리를 지정하여야 합니다.


#include <Wire.h>


연결 구성은 하나의 마스터와 다수의 슬레이브로 구분되고 슬레이브들은 7bit 혹은 8bit 아이디(숫자)로 서로를 구분합니다. TWI는 모든 통신 주도권을 master가 가진다. 슬레이브에서 데이터를 읽어올 때도 마스터에서 요구하고 슬레이브로 데이터를 보낼 때도 마찬가지로 마스터에서 통신을 요구한 후 보냅니다. 마스터에서는 다음과 같이 초기화 함수를 호출합니다.


Wire.begin(); // 마스터의 TWI 초기화


슬레이브에서는 다음과 같이 초기화 함수를 아이디를 가지고 호출한다.


Wire.begin(n); // 슬레이브의 TWI 초기화


Wire.begin(n) 함수는 n번 슬레이브의 TWI 초기화하는 명령이며, 아이디 n을 가지는 연결된 마스터에서 기기간에 구별을 하게 됩니다.


마스터에서 슬레이브로 데이터 보낼 때는 Wire.beginTransmission(id) 함수로 아이디가 id인 슬레이브와 TWI 통신을 시작합니다. 그리고 Wire.write(byte) 함수로 byte형 데이터를 보내고, Wire.endTransmission() 함수로 통신을 끝냅니다. Wire.write() 함수는 입력 변수의 자료형에 따라 다음과 같이 3가지가 전송할 수 있습니다.


Wire.write(byte by); // byte형 데이터 하나를 전송

Wire.write(string str); // 문자열 str을 전송

Wire.write(const byte *ptrByte, int n); // byte형 포인터에 저장된 byte 배열에서 n개의 데이터를 전송


슬레이브 쪽에서는 마스터에서 데이터를 보냈을 때 호출되는 이벤트 함수를 다음과 같이 등록해 두면 데이터가 보내졌을 때 이 함수가 호출되어 처리가 가능하게 됩니다. Wire.onReceive() 함수를 이용해서 사용자가 지정한 receiveEvent() 함수를 데이터가 보내졌을 때 호출될 함수로 등록합니다.


void setup() {

    Wire.onReceive(receiveEvent);

}

....

....

void receiveEvent(int iNum) 

{

    byte by[iNum];

    for(int n=0; n<iNum; n++)

        by[n] = Wire.read();

}

위와 같이 등록된 이벤트 핸들러는 넘겨받은 바이트 수를 입력으로 건네주게 되고, Wire.read() 함수를 이용하여 by 변수에 저장하게 할 수 있습니다.


마스터가 슬레이브에서 데이터를 받을 때에도 마스터에서 먼저 요구하며 그 요구에 슬레이브가 반응하도록 되어 있는데, 마스터에서 슬레이브에 데이터를 요구하고 읽어오는 과정은 다음과 같습니다.


byte by[n], m=0;

Wire.requestFrom(id, n); // id를 가지는 슬레이브에 n 바이트를 보내기를 요구한다.

while( Wire.available() ) // 읽어올 데이터가 버퍼에 남아있다면

{

    by[m++]=Wire.read(); // 데이터를 읽는다.

}


슬레이브 측에서는 마스터에서 요구가 올 때 처리할 이벤터 핸들러를 다음과 같이 등록해 두면 됩니다. 다음 예를 마스터의 전송 요구시 호출된 사용자 지정의 requestEvent() 함수를 등록합니다. 결론적으로 마스터와 슬레이브 사이에 통신을 할 경우 마스터에서 슬레이브 쪽으로 통신을 하겠다는 요구를 먼저 하게 되어 있다는 것입니다.


Wire.onRequest( requestEvent ); 

...

...

void requestEvent()

{

    Wire.write(100); // (예를 들어) 100이라는 숫자를 전송한다.

}



'Embedded Lecture > Arduino' 카테고리의 다른 글

아날로그 입력  (0) 2017.03.18
인터럽트와 volatile 지시자  (1) 2017.03.18
아두이노의 시리얼 통신  (0) 2017.03.18
인터럽트의 처리(1)  (0) 2017.03.12
LED 깜박이기  (0) 2017.03.12
Posted by Nature & Life


Arduino Uno R3는 가장 널리 사용되는 입문용 기본 보드로 R3는 세번째 버젼을 의미합니다. 이 보드는 8-bit 마이크로 콘트롤러인 ATmega328P을 탑재하며 PC와 USB로 연결할 수 있어 프로그램 다운로드 및 시리얼 통신에 가능합니다. 그 밖에도 ATmega16U2의 또 다른 마이크로 콘트롤러를 내장하는데, 이는 기존 보드들에서 사용하던 FTDI FT232R USB-to-Serial 드라이버 칩을 대체하기 위한 것으로 USB-to-Serial 변환 프로그램이 들어 있습니다. ATmega328P는 1KB의 부트로터(Bootloader)용을 포함한 32KB의 Flash 메모리와 2KB의 SRAM, 1KB의 EEPROM을 갖고 있으며, 클럭 속도(Clock speed)는 16MHz입니다.


5V로 동작하는 이 Uno 보드의 전원공급은 두 가지 방법이 있는데, 첫번째는 USB로부터 제공되는 5V를 그대로 사용할 수 있으며, 두번째로는 7~12V의 AC 어댑터를 잭에 꼽아 외부에서 공급하는 방법인데 이는 Uno 보드가 내부적으로 5V를 정류하는 레귤레이터(Regulator)를 내장하고 있기 때문이며 위의 두 가지 전원이 모두 연결되어 있다면 외부 전원이 우선이 됩니다.



디지털 입출력 핀 14개 (0번~13번)

디지털 입출력 핀들을 이용해서 외부의 이진 신호를 읽어들어나 또는 이진 신호를 내보낼 수 있다. 디지털 입출력으로 사용되면서 또한 다른 기능을 가지는 핀들이 있는데, 이 기능들은 한 핀으로 두가지를 다 사용할 수는 없으며 다른 기능은 다음과 같습니다.

    • 0번~1번: 시리얼 통신에 사용되어 USB로 PC와 통신을 할 수 있습니다.

    • 2번~3번: 인터럽트(interrupt) 기능을 갖습니다.

    • 3, 5, 6, 9, 10, 11번 핀은 PWM 기능을 가지며 아날로그 출력을 흉내낼 수 있다.


아날로그 입력 핀 6개 (A0~A5)

외부의 아날로그 입력값을 읽어들여 ATmega328P칩 내부의 ADC(Analog to Digital Converter)를 이용하여 0~1023 사이의 숫자로 변환합니다. 이때 필요한 기준 전압은 5V 이지만 1.1V의 내부 전압이 사용될 수 있으며 AREF핀으로 기준 전압을 직접 인가할 수도 있습니다. 그리고 아날로그 핀은 디지털 입출력 핀으로도 사용할 수 있습니다.


아날로그 출력핀 6개 (3,5,6,9,10,11번 핀)

아날로그 출력핀은 0~5V사이의 전압 값(256레벨)을 가질 수 있으며 이는 PWM(Pulse Width Modulation) 방식으로 동작하므로 흉내를 내는 것입니다.


인터럽트 (2, 3번 핀)

2번과 3번 핀에 가해진 외부 이벤트를 감지하여 사용자가 원하는 방향으로 이를 처리하기 위한 기능으로 이를 인터럽트 처리(interrupt handling)라 부르는데, 즉 이 핀들에 변화가 있는면 하드웨어는 즉각적으로 알리고 이때 사용자가 원하는 정해진 동작을 코딩하여 사용합니다.



ICSP for ATmega328 : 기존의 ATmega328P에 ICSP(In Circuit Serial Programming)를 위한 SPI 통신용 6핀 포트입니다. ICSP는 전통적으로 마이크로 컨트롤러에 직접 펌웨어를 프로그래밍하기 위해 마련된 것입니다.


ICSP for USB interface : 기존의 ATmega16U2에 ICSP(In Circuit Serial Programming)를 위한 SPI 통신용 6핀 포트입니다. 


TWI(I2C) 통신 : A0, A1 핀




Posted by Nature & Life
Drone News/Review2017. 2. 23. 22:13


Cheerson CX-20 Auto-Pathfinder는 'Quanum NOVA'라고도 불리우며 비행제어기(flight controller)로서 APM v2.5.2가 사용되며 firmware는 ArduCopter v3.1.2입니다. APM v2.5.2는 외장 지자기(magnetometer) 센서을 사용하며 메인 마이크로컨트롤러는 ATmega2560입니다.


다음은 Cheerson CX-20 Auto-Pathfinder의 내부 구성입니다.


CX-20 Auto-Pathfinder(Quanum NOVA)의 내부 모습


외장 I2C magnetometer와 APM v2.52


Barometric sensor를 보호하기 위해서 폼(foam)을 사용


APM과 프레임 사이에 진동을 차단하기 위해서 폼(foam)을 사용


GPS 


APM은 위의 CPU 보드와 아래의 I/O 보드로 구성


I/O 보드


Brushless 모터와 ESC


CPU 보드(APM v2.5.2)


I/O 보드


Cheerson CX-20 Auto-Pathfinder의 Open Source Version의 구입처:



Posted by Nature & Life


AutoQuad 6 Flight Controller


What makes the AutoQuad flight controllers special?


무엇이 AutoQuad 비행제어기(FC)를 특별하게 만들까요?


Besides using top quality sensors and MCU, AutoQuad differs in its approach of using sensor calibration techniques and calculating the magnetic profile of the entire multirotor creating the ultimate stable flying and navigation experience.


최고 양질의 센서들과 MCU를 사용한 것 외에도 AutoQuad는 센서 보정 기술을 사용하는 그리고 최고의 안정된 비행과 조종 경험을 갖게 하는 전체 멀티로터의 자기 프로파일을 계산하는 접근 방식에서부터 차이가 납니다.





Summary of specifications of the AQ 6.x flightcontroller hardware

    • 2″ x 2.5″ main board with 4.5×4.5cm mounting hole pattern

    • Input voltage: 6.5v => 18v

    • 2 High efficiency DC/DC converters, separate power to flight controller logics and accessories.

    • STM32F407 32bit Cortex M4 microcontroller (1MB flash)

    • Standard Arm 10 pin 0.05″ pitch SWD connector

    • 14 general purpose PWM controllers / receivers (powered or un-powered)

    • Dedicated Spektrum satellite (remote receiver) 2.4Ghz R/C radio connector

    • uSD card slot driven by 4bit SDIO capable of 100Mb/s transfer (up to 32GB storage)

    • onboard uBlox LEA-6T GPS module with battery backup and time pulse capture

    • u.FL active GPS antenna connector

    • optional external bi-directional telemetry radio via standard 6 pin FTDI connector – powered up to 1A

    • I2C bus connector for I2C ESC’s (or other I2C devices)

    • X, Y Mag: HMC6042

    • Z Mag: HMC1041Z

    • X, Y Gyro: IDG500

    • Z Gyro: ISZ500

    • Accel: ADXL325

    • Pressure Sensor: MP3H6115A (optional 2. tube sensor)

    • Battery voltage monitor


Onboard IMU options:


Summary of capabilities of the AQ 6.x firmware

    • Fly extremely stable yet offer full dynamic control to the pilot.

    • Limit flying angles.

    • Mavlink 1.0x compatible protocol, Ground Stations for Win, Mac, Linux & Android

    • Very accurate position hold, depending on GPS reception a hold within 15-30 cm is possible.

    • Altitude override (ascend / descend) during position hold with controlled vertical speed.

    • Full mission flight, speed, heading and 'loiter time' is settable.

    • Return to home position, altitude is also recorded during home position set.

    • POI (point of interest), autonomous circling around given coordinates

    • Heading Free flight mode, Follow Me, Click & Go (needs exp. firmware)

    • Radio loss detection and event triggering.

    • Low battery detection and event triggering.

    • 2 axis gimbal control with pitch angle override on transmitter.

    • Gimbal working angle and response time is settable.

    • Gimbal servos can use 50Hz (analog) to 400+ Hz (digital) settable.

    • Radio options: Spektrum satellite (10 & 11bit), S-bus receiver, (C)PPM input, SUMD (Graupner) M-Link (Multiplex)

    • User Addon Waypoint recording and playback using transmitter switch.

    • User Addon External LED / Piezo signaling for status and events, MAVLink telemetry for Graupner HOTT radios





'Radio Control > Flight Controller' 카테고리의 다른 글

비행제어기(FC)의 역사와 종류(1)  (1) 2020.03.28
비행제어기(FC)란?  (0) 2017.03.07
AutoQuad 사이트에서 소소 코드를 확인하는 법  (0) 2015.12.02
AutoQuad란?  (0) 2015.11.29
APM v2.5 vs. Crius AIOP  (0) 2014.03.04
Posted by Nature & Life


ESC(electronic speed controller)를 설계할 때 왜 STM32가 유리한가요?


  • High side와 low side에 PWM이 automatic dead-time이 추가를 허용하는 일차적인 FET 제어기로서 TIM1을 사용할 수 있고 다른 이득 등을 제공합니다.

  • 저 비용의 개발 툴

In-Circuit Debugger/Programmer

  • 컴파일러로써 ARM GCC

  • SWD 프로그래밍/디버깅

  • I2C, CAN 지원

  • PWM 제어

  • 클럭 정밀도

정밀한 클럭은 일부 외장 오실레이터(oscillator) 타입을 요구합니다. STM32 내부 오실레이터의 정밀도는 1% 이내입니다. 이는 closed loop 실제 속도, PWM 주파수 정밀도 그리고 timing에 연관된 어떤 보고된 값들에 영향을 줍니다. 또한 이는 UART 최대 통신 속도에 어떤 밀접한 관계를 갖을 것입니다.

일차적인 클럭 속도는 72MHz의 외장 부품을 사용할 수 있지만 내부 오실레이터를 사용할 때 64MHz로 제한됩니다. 이는 64MHz에서 보드상에 프로세싱 파워가 충분하기 때문에 문제가 되질 않습니다.

  • UART

오픈 소스 커뮤너티에서 요구하는 것처럼 USART에 완전한 FTDI 접근을 합니다. 이를 사용하여 CLI(시리얼 터미널과 같은 Command Line Interface)가 구현될 수 있습니다.

  • 모든 FET 상에 게이트 저항

이는 FET turn-on 특성에 정밀한 제어를 할 수 있습니다. FET를 천천히 켜는 것(높은 게이트 저항)은 FET 상에 손실을 증가시킵니다. 그러나 전압 버스에 고주파 잡음을 엄청나게 줄일 수 있습니다. FET를 빠르게 켜는 것(낮은 게이트 저항)은 FET의 손실을 감소시키지만 전압 버스 상에 엄청난 잡음을 증가시킬 것입니다. 이것은 마이크로컨트롤러의 reset, 버스 커패시터 사이즈 그리고 다른 잡음 관련된 설계 결정 이슈에 큰 영향을 줍니다. Dead-time에 관련하여 너무 짧다면, 느린 FET는 실제로 위험할 수 있습니다.

  • 최근에 AVR 시리즈와 같이 STM32 시리즈도 Arduino 환경을 지원합니다.

  • 특히 Cortex M4 경우에 100% C 언어 프로그램이 가능합니다. 고성능의 high end 급의 소형 마이크로컨트롤러로 RISC, Pipeline 등의 구성으로 사실상 assembly 코딩이 불가능하지만, 다른 마이크로컨트롤로 달리 C 언어를 완벽하게 지원하여 assembly의 이해가 필요 없다는 것입니다. 기존의 마이크로컨트롤러는 C 언어를 지원하여도 최상의 성능을 위해서는 assembly 코딩이 불가피하지만 Cortex M4는 의미가 없으며 C 언어에서 지원하지 않은 명령어에 대해서는 intrinsic 함수로 assembly 코드로 1:1 변환하며, 디버깅 시에 C 언어 소스 코드가 의도한 assembly 코드로 올바르게 컴파일 되었는지 확인할 수 있는 정도의 assembly 언어 지식이 요구됩니다.



'Embedded Programming > STM32 Cortex-M4' 카테고리의 다른 글

STM32 MCU 누클레오 보드  (0) 2018.01.12
Discovery vs. Nucleo board  (1) 2018.01.11
STM32F4 시리즈의 소자 구별 방법  (0) 2018.01.03
STM32F405xx 스펙 요약  (0) 2017.11.17
AVR vs. STM32 comparison for Drone  (0) 2015.12.04
Posted by Nature & Life


아두이노(Arduino)가 오픈 소스 플랫폼으로 자리잡은 이유는 AVR 칩이 제공하는 Self-programming 기능으로 거슬러 올라갑니다. Self-programming 기능이란 칩의 퓨즈를 적절히 설정함으로써 부팅시 Application 영역이 아닌 Boot 영역으로 시작 지점이 변경된다는 것입니다.



한편, AVR 칩은 추가적인 하드웨어 구성 없이 USART나 TWI, SPI 등으로 통신이 가능한데, 칩이 Boot 영역에서 수신된 데이터를 감지하고 Application 영역을 변경할 수 있다는 것입니다. 이러한 기능은 3세대 AVR 칩에서 등장하여 펌웨어의 유지 및 보수 목적으로 특히 가혹한 원격지에서 펌웨어 업그레이드에 유연성을 주기 위함이었습니다.


따라서 이러한 기능이 가능하게끔 작성된 Bootloader를 최초 한번 JTAG이나 ISP를 이용하여 펌웨어를 프로그래밍을 하면 아두이노는 그 다음부터 ISP 없이 USART로 프로그램의 간단히 업로드가 가능하게 됩니다. 결국 아두이노 보드는 아래 회로도에서와 같이 별도의 ATmega16U2 칩을 이용해 USB로 데이터를 송수신하고, 이를 다시 ATmega328 칩에 USART 규격으로 통신하는 구조를 가집니다.



요약하면 아두이노 IDE 환경은 AVR 칩에 최초 Bootloader를 탑재하여 PC의 USB 포트로 C 코드인 스케치(Sketch) 파일을 컴파일하고 이를 아두이노 보드로 추가의 하드웨어 없이 전송하여 쉽고 빠른 개발환경을 제공한다는 것입니다. 게다가 아두이노 IDE 환경에서 함께 제공하는 Serial Monitor를 이용해서 클릭 한번으로 그 결과를 바로 확인할 수 있다는 장점을 가집니다.





Posted by Nature & Life

 

 

통신약정(Protocol)이란 데이터를 보내는 사람과 받는 사람이 정보를 오류없이 원할히 주고 받을 수 있도록 쌍방간에 정하는 규칙 혹은 약정입니다. 이는 원거리 인터넷이나 FAX 통신도 혹은 PC와 그 주변기기와의 통신같은 근거리 통신에도 반드시 존재하며 자동차 내에서 혹은 한 보드내에서 칩과 칩 사이의 통신에도 적용됩니다.

 

AVR의 경우에는 다른 칩과의 통신방법으로 SPI(Serial Peripheral Interface)인 SCI(Serial Communication Interface, UART)나 TWI 통신을 지원합니다. 어느 정도 근거리 통신에서도 사용되어야 하기에 송수신에 앞서서 노이즈 등에 대비하여 신호의 크기를 키워야 할 필요가 하는데 이것이 PC 등에 사용되는 RS232C 트랜시버가 됩니다.

 

이러한 SPI 방식에서는 보내는 라인과 받는 라인 그리고 동기화된 클럭(Clock)으로 3가닥의 라인을 필요로 하였고, 한편 이 라인의 수를 더 간소화시켜 오직 2가닥 만으로 데이터의 송수신을 가능하게 한 새로운 인터페이스(Interface)를 제공하게 되었는데 이를 TWI라고 명명합니다.

 

TWI는 'Two Wire Interface'의 약자로 이를 통해서 AVR 칩은 오직 2가닥 만으로 128개의 다른 장치들과의 통신할 수 있다는 것입니다. TWI는 Atmel社 등이 주로 사용하지만 1980년대 Philips社에서 만든 I2C 인터페이스와 매우 유사하여 하드웨어의 별다른 수정없이 그대로 사용할 수 있다는 장점이 있습니다. 통상 I2C 인터페이스가 2가닥의 라인을 이용하므로 TWI라 부르게 되었습니다.

 

Philip社에서 제창한 I2C(IIC)는 칩(IC)간의 통신을 의미하는 'inter IC(Integrated Circuit)'의 준말로 'i square c'라고 읽으며, 비록 서로 다른 회사로부터 만들어졌지만 10-bit 주소나 고속 모드(high speed mode) 등에 차이를 제외하면 서로 호환가능하여 수정없이 사용할 수 있다는 것입니다.

 

TWI 통신이 가능한 장치는 데이터(SDA, Serial Data Line)와 클럭(SCL, Serial Clock) 라인이 공통 버스(bus)에 연결되어 고유의 주소값을 가져 다른 칩과 통신시 master와 slave의 관계를 번갈아가며 데이터의 송수신이 가능합니다. 표준 모드(standard mode)에서 100kbit/s로 통신할 수 있고 버스의 capacitance가 400pF을 넘지 않는 한도에서 칩을 계속 연결할 수 있다고 알려집니다.

 

 

 

 

간단하게 설명하면 아래 그림과 같이 데이터(SDA)를 클럭(SCK)에 동기화하여 주고 받는 방식으로 먼저 데이터를 주고 받고자하는 장치 주소(Address)를 1~7번 비트에 싣고 보낼지 읽을지에 따라서 8번 비트를 Read('1')나 Write('0')로 설정하며 그 다음에 데이터를 연속적으로 읽거나 실을 수가 있다는 것입니다.

 

 

 

여기서 ACK 비트는 정보의 송신자에게 직전 8-bit의 정보를 수신했는지의 여부를 확인하는 값입니다.

 

 

'Flight Controller 이해 > 인터페이스' 카테고리의 다른 글

CAN 통신이란?  (0) 2017.12.24
드론에서 사용되는 무선 통신  (1) 2017.03.09
Posted by Nature & Life