최근 수업 과정에서 오드로이드와 라즈베리 파이의 GPIO로 소프트웨어 PWM, RS-232를 구현하고 있다. 물론, 하드웨어의 PWM을 이용하는 것보다는 깨끗한 파형을 내기 힘들다. 그러나 오실레이터나 크리스탈, 혹은 CPU Clock을 SW로 나누고 그것을 이용해 모터를 제어 하거나 관련 프로토콜을 SW로 구현하는 것은 꽤 괜찮은 수업 방식이라고 생각되어 진행하게 되었다.


결론은 잘 된다는 것. <- 이게 젤 중요하지


그러나 구현 과정에서 학생들이 보드를 많이 태웠는데 그 이유는 다음과 같았다.


1. 전원 연결이 중간에 끊겨 GPIO의 전류가 역방향으로 흐르게 하였다. 전원 껐다 켰다 하며...

2. 장치 연결 시 풀다운 저항이나 캐패시터를 이용하지 않았다.

3. 데스크톱과 직접 연결 시 전압 체크를 하지 않았다.

4. 주변 장치 연결 시 전원이 켜진 상태로 연결하였다.(GPIO, 화면 출력을 위한 HDMI 포트 等)


그리하여 작년 수업 과정과 합해서 총, 15대의 보드가 고장 났다. 물론, 1달 내내 수많은 과제를 하는데, 관련 과제가 많아 보드를 혹사시키는 것도 문제다. 실습 장비가 없으면 안되기에 미리, 어느 정도 귀띔은 해준다. 따라서 고의적으로 보드를 태우게 한 것은 아니다. 다만, 전자공학과 및 컴퓨터 공학 대학원까지 졸업하거나 전자공학과 4학년을 졸업한 친구들도 있기에 실무는 다르다는 것을 말해주고 싶은 마음이 있는 것은 사실이다. 간단히 말하면 보드를 태운 경험은 정말 소중하다는 것. 고의는 아니지만, 그에 따르는 수리나 추가 구입 비용에 대한 질타는 내 몫이다.


실무경험으로 한 가지 확실한 것은 GPIO를 이용한 프로젝트 진행 時 오드로이드에 반해 라즈베리 파이는 쇼트가 잘 나지 않는다는 것. 두 보드 모두 장/단점이 있고 이용 목적에 따라 다르다. 다만, 앞으로는 교육 비용 문제로 격이 더 저렴한 라즈베리파이를 이용하게 될 것 같다. 사실, 커뮤니티가 잘 안 되어 있는 보드를 찾아서 작년 1달 교육을 진행했는데,... 이제는 위키가 너무 잘 되어 있는 것도 하나의 이유.


소스는 github에 GPL 3.0으로 공개하고 모두 함께 작업하기로 하였다.


소스를 바로 보는 것은 실력 향상에 도움이 되지 않으니, 다음과 같은 과정을 거쳐 공부하길 바란다.


1. 오실로스코프로 UART 단자의 신호를 분석한다.

2. 하드웨어/소프트웨어 플로우 컨트롤 및 패리티 비트를 빼고 10비트가 나오는지 확인한다.

3. 시작 비트는 0 이 되는 순간이다.

4. 같은 신호를 GPIO와 delay 함수를 이용하여 구현한다.

5. usleep은 문제가 있어서 다른 함수(nanosleep)를 찾게 되고, 그것도 여의치 않아서 시간 계산을 따로 하는 함수를 찾게 된다.

6. 구현된 신호로 GPIO를 이용하여 UART Tx를 만든다.

7. 한 문자만 보내는 것을 여러 문자가 보내 지도록 함수를 만든다.

8. Rx도 같은 방법으로 구현한다. 다만, 같은 GPIO로 연결하면 둘 다 HIGH 상태이기 때문에 [처리]가 필요.

9. Tx, Rx 모두 구현하기 때문에 자신만의 신호를 만들 수 있다.

10. 완성형 한글 지원부터 유니코드 지원까지 customized UART protocol을 만들어 본다.

11. RS-232, 422, 485 까지 비교해 본다.


이런 과정을 거치면 같은 시리얼 통신인 CAN, I2C, SPI, I2S, CAN, USB 등을 한 번에 이해할 수 있게 된다. 일이관지(一以貫之, 하나의 이치로 모든 것을 꿰뚫는다). 인터넷을 돌아다니다 보면 UART, SPI, I2C 잘못 비교된 글이 많더라. UART 자체적으로 RS-232, 422, 423, 485 에 따라 속도나 전송거리, full/half duplex로 나뉘는데 그걸 마치 UART와 SPI, I2C의 차이로 적은 자료가 많았다. 주의! 주의!


'블로그 항해 일지 > Embedded' 카테고리의 다른 글

x86용 부트코드  (0) 2019.01.08
ODROID GPS 모듈 입양 完  (2) 2019.01.08
GPIO 제어 via 블루투스 on 삼성폰  (0) 2019.01.08
블루투스 연결  (0) 2019.01.08
GPIO 컨트롤  (0) 2019.01.08

부트코드를 이해하기 위해 USB에 부트코드를 만들고 USB로 부팅하는 방법을 소개한다. BIOS에서 부팅 순서는 변경 시킬 수 있고, 컴파일러의 역할을 알고 있는 사람이라면 쉽게 할 수 있겠다.


http://www.yes24.com/24/Goods/1469757?Acode=101

rawwrite를 찾을 수가 없어 dd 윈도우즈 버전으로 대체하여 실행하였다. 하드 지우긴 그래서 USB로 부팅하였다. USB 중 SANDISK는 안된다. 내부적으로 보안 영역이 따로 있어 이미지를 0번지부터 써도 0번지부터 기록되지 않는 듯하다. 윈도우용 부트로더를 먼저 이해하고 u-boot와 리눅스 커널을 보면 한결 쉽다.


[org 0]

[bits 16]

jmp 0x07C0:start    ;far jmp 를 한다.

start:

mov ax, cs    ;cs 에는 0x07C0 이 들어 있다.

mov ds, ax     ;ds 를 cs 와 같게 해준다.

        mov ax, 0xB800    ;비디오 메모리의 세그먼트를

mov es, ax    ;es 레지스터에 넣는다.

mov di, 0;제일 윗 줄의 처음에 쓸 것이다.

mov ax, word [msgBack] ;써야 할 데이터의 주소값을 지정한다. 

mov cx, 0x7FF       ;화면 전체에 쓰기 위해서는 

    ;0x7FF(10진수 2047)개의 WORD 가 필요하다.

paint:

mov word [es:di], ax;비디오 메모리에 쓴다.

add di,2;한 WORD를 썼으므로, 2를 더한다.

dec cx    ;한 WORD를 썼으므로, CX 의 값을 하나 줄인다.

jnz paint   ;CX 가 0이 아니면, paint로 점프하여

   ;나머지를 더 쓴다.

mov edi, 0;제일 윗 줄의 처음에 쓸 것이다.

mov byte [es:edi], 'A'  ;비디오 메모리에 쓴다.

inc edi;한 개의 BYTE를 썼으므로 1을 더한다.

mov byte [es:edi], 0x06 ;배경색을 쓴다.

inc edi;한 개의 BYTE를 썼으므로 1을 더한다.

mov byte [es:edi], 'B'

inc edi

mov byte [es:edi], 0x06

inc edi

mov byte [es:edi], 'C'

inc edi

mov byte [es:edi], 0x06

inc edi

mov byte [es:edi], '1'

inc edi

mov byte [es:edi], 0x06

inc edi

mov byte [es:edi], '2'

inc edi

mov byte [es:edi], 0x06

inc edi

mov byte [es:edi], '3'

inc edi

mov byte [es:edi], 0x06

jmp $;이 번지에서 무한루프를 돈다.

msgBack db '.', 0xE7;배경색으로 사용할 데이터

times 510-($-$$) db 0;여기서 부터, 509 번지까지 0 으로 채운다.

 dw 0xAA55;510 번지에 0xAA 를, 511 번지에 0x55 를 넣어 둔다.



updated at 20180722

다시 커널 책을 펴다 -> 현제 제목으로 변경 후 매거진 변경(Linux Master)

정상동작 확인(역시 Sandisk에서는 안되니 다른 USB 사용 요망)


nasm -Administrator 권한으로 설치 必

C:\NASM>nasm -f bin -o boot.bin boot.asm


USB 드라이브가 e라고 가정

C:\NASM>dd if=c:\nasm\boot.bin of=\\.\e: bs=512 count=1


NASM 2.13.01_64bit magnet

magnet:?xt=urn:btih:BDFF52A5C3CDD8604D4921CE75DD6D9D549D10BE&dn=nasm-2.13.01-installer-x64.exe&tr=udp%3a%2f%2ftracker.openbittorrent.com%3a80%2fannounce&tr=udp%3a%2f%2ftracker.opentrackr.org%3a1337%2fannounce


DD 0.4 beta magnet

magnet:?xt=urn:btih:2ACA21B101B83BBB83A663A90D7905A573A6EB81&dn=dd-0.4beta1.exe&tr=udp%3a%2f%2ftracker.openbittorrent.com%3a80%2fannounce&tr=udp%3a%2f%2ftracker.opentrackr.org%3a1337%2fannounce

'블로그 항해 일지 > Embedded' 카테고리의 다른 글

SW PWM, UART 구현  (0) 2019.01.11
ODROID GPS 모듈 입양 完  (2) 2019.01.08
GPIO 제어 via 블루투스 on 삼성폰  (0) 2019.01.08
블루투스 연결  (0) 2019.01.08
GPIO 컨트롤  (0) 2019.01.08

낙서 같은 거라서 ODROID 매거진이 아닌 ETC에 넣는다.


판다. 하드커널에서

설명서도 제공한다

https://wiki.odroid.com/accessory/connectivity/usb_gps

근데 설명서 업데이트를 해야할 것 같다. 제대로 안된다.


여하튼, 디바이스 드라이버가 잘 동작하고 관련 앱이 잘 도니

cgps는 


gpsmon은

근데 왜 값이 다를까 ㅡㅡ; 다른 플랫폼이라면 이해하겠는데 말이다 ㅠㅠ 

Latitude, Longitude는 정말 중요한데 말이다 ㅠㅠ


gps라 결국 모듈은 창문 밖으로 내어 놓아야 했다.


배움은 힘들다. 메뉴얼도 한번에 되는 것도 없다.

또 한, 계속 돈이 들어가고. 용어의 모호함도 많다. 


책도 그렇다.

서점을 가면, 프로그래밍 언어 관련 책은 외서 번역본이 많은 이유가 국내에서 뭔가를 제대로 정립해서 대가가 되어 이론을 만든 사람이 없다. 다 차용했다. 그래서 번역이 이상하게 된다.


프로그래밍 서적은 간단하다. 모든 것은 CPU와 메모리의 장난에서 출발하면 좋을 것 같다.

어려운 용어도 간단해진다.

선언 declaration : 변수의 저장 메모리 예약

정의 definition : 예약된 메모리에 데이터를 저장

초기화 initialization : 선언과 정의를 동시에


오늘도 기초 공부를 한다. 나이가 들고 경험이 쌓일수록 더더욱 기초만 공부하게 되는 것 같다.

integral - signed, unsigned, (struct, union, enum), (pointer, array, function) ...

'블로그 항해 일지 > Embedded' 카테고리의 다른 글

SW PWM, UART 구현  (0) 2019.01.11
x86용 부트코드  (0) 2019.01.08
GPIO 제어 via 블루투스 on 삼성폰  (0) 2019.01.08
블루투스 연결  (0) 2019.01.08
GPIO 컨트롤  (0) 2019.01.08

글자 수 ㅠㅠ 한글이 abbreviations 주말 엄마와 아이가 놀러 간 틈을 타, 


전등, 모터 등을 켜고 끌 때 블루투스를 이용하면 편리할 것 같고 이미 많은 사람들이 미리 만들어 놔서 오픈소스를 이용하여 금방 구현하였다. 3시간, 검색 및 오픈소스 검증 2시간, 수정 코딩 1시간. 


제목을 수정했는데 on 삼성폰이라고 ... Android 니 LG에서도 되겠지만 안해봤으니 그렇게 안 적으련다.


0 결과

https://www.youtube.com/watch?v=AuZUqi0V7qc


1 소스

http://webnautes.tistory.com/1137

https://github.com/OmarAflak/Bluetooth-Terminal

* 참조

http://ippuu.iptime.org/entry/Linux-Device-Driver-XU3XU4-GPIO-Timer-%EB%B0%8F-IOCTL-%EC%A0%81%EC%9A%A9-%EC%A0%9C%EC%96%B4

http://ippuu.iptime.org/entry/Device-DriverXU3XU4-GPIO-%EC%A0%9C%EC%96%B4-%EA%B4%80%EB%A0%A8


2 유의사항

- Android 터미널은 마이그레이션 해야 한다. 대부분 자동으로 되는데 중간에 퍼미션은 열어 줬던 듯. 

- 라즈베리나 오드로이드나 둘 다 리눅스 기반이지만 기본 탑재된 패키지가 다르니 몇몇 설치해줘야 패키지가 있을 것이다

- 컴파일 때, 라이브러리 지정 순서도 중요하다 -lwiringPi -lpthread -lcrypt -lwiritingPiDev -lm -lrt -lbluetooth 순으로 했다. 안 되는 조합이 딱 1개 있었는데 좀 신기했음. Makefile 만들기 전 테스트라 ^^;;


3 결론

블루투스 프로토콜 스택은 참 잘되어 있다. 오픈소스도 많다. 1.0~4.0까지의 하위 호환성도 참 좋다.

'블로그 항해 일지 > Embedded' 카테고리의 다른 글

x86용 부트코드  (0) 2019.01.08
ODROID GPS 모듈 입양 完  (2) 2019.01.08
블루투스 연결  (0) 2019.01.08
GPIO 컨트롤  (0) 2019.01.08
Ubuntu Image download  (0) 2019.01.08

ODROID에 BT 동글을 연결해 봅니다.


!! bT동글을 꽂았는데 안되는 경우

# dmesg -Hw

실행 해 보시면 간혹 USB 허브를 이용하는 경우 제대로 인식이 안되는 경우가 있다는 것을 알 수 있습니다. 

10번 중 1번 정도 발생


PARING

기본 내장이지만 customize 해서 쓰시는 분은 아래 패키지 설치 하셔야 합니다.

sudo apt-get install bluetooth bluez bluez-tools rfkill rfcomm

lsmod | grep bluetooth 로 검색되시면 블투모듈이 올라온겁니다.


# bluetoothctl

# list (이 명령어는 자동 실행됨)

[New] Controller 00:1A:7D:DA:71:13 odroid

로 ODROID MAC Address 확인

# info 00:1A:7D:DA:71:13 로 세부정보 확인 가능


# power on (보통 자동으로 on되어 있음)

# scan on

Android 휴대폰 MAC Address 확인


# scan off

# agent on

# default-agent

# pair XX:XX:XX:XX:XX:XX

# trust XX:XX:XX:XX:XX:XX 


볼거리

https://code.tutsplus.com/tutorials/create-a-bluetooth-scanner-with-androids-bluetooth-api--cms-24084

https://developer.android.com/guide/topics/connectivity/bluetooth?hl=ko

https://stackoverflow.com/questions/6141668/bluetooth-examples-for-android

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothSocket.java

https://arsviator.blogspot.com/2010/05/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%B8%94%EB%A3%A8%ED%88%AC%EC%8A%A4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-bluewatch-project-2.html

https://github.com/bablokb/pi-btnap

'블로그 항해 일지 > Embedded' 카테고리의 다른 글

x86용 부트코드  (0) 2019.01.08
ODROID GPS 모듈 입양 完  (2) 2019.01.08
GPIO 제어 via 블루투스 on 삼성폰  (0) 2019.01.08
GPIO 컨트롤  (0) 2019.01.08
Ubuntu Image download  (0) 2019.01.08


GPIO 제어를 위해 WiringPI library를 이용합니다. WiringPI는 Broadcom의 BCM2835, BCM2836, BCM2837 칩을 위한 라이브러리입니다.

http://wiringpi.com/




브로드컴의 BCM 시리즈 칩은 다음과 같은 페리(Peripheral, 주변장치)를 붙여 설계할 수 있습니다.


• Timers

• Interrupt controller

• GPIO

• USB

• PCM / I2S

• DMA controller

• I2C master

• I2C / SPI slave

• SPI0, SPI1, SPI2

• PWM

• UART0, UART1 

* 2835 datasheet 참조 https://www.raspberrypi.org/app/uploads/2012/02/BCM2835-ARM-Peripherals.pdf




Raspberry Pi Model B+ 은 Broadcom BCM2835을 쓰고, Raspberry Pi 2 Model B는 Broadcom BCM2836 칩을 씁니다. 둘 다 GPIO 개수가 40개로 ODROID-XU4 보다 10개가 많습니다. 라즈베리 파이는 PWM도 달려있어 장치 제어에 많이 쓰고 그만큼 유저도 많습니다. 현재로서는 직접 설계 없이 콘텐츠를 붙이는 장치 제어 필드(업계)에서는 사실 오드로이드 보다는 라즈베리 파이를 이용한 프로젝트가 많습니다. 다른 것 보다 가격이...

https://www.board-db.org/compare/84,4,28/




ODROID에는 듀얼코어(Samsung Exynos5422 Cortex-A15 2 Ghz and Cortex-A7 Octa core CPU) 칩이 들어 있습니다. 브로드컴 제품이던 삼성 제품이던 둘 다 ARM Architecture를 기반으로 하기 때문에 S/W도 비슷하게 갑니다. ODROID를 제작한 HardKernel에서도 wiringPI를 이용합니다. 이전에는 잘 정리된 위키 페이지가 없어서 많은 삽질(실습)을 했어야 했습니다. 지금은 아래 사이트 보고 그대로 따라 하면 만들기 쉽도록 되어 있습니다.

https://wiki.odroid.com/odroid-xu4/application_note/gpio/wiringpi




1편에서 리눅스를 설치했으니 대부분의 장치는 리눅스에서 제어하도록 매핑되어 있습니다. 펌웨어 단에서 장치에서는 MMIO(Memory Mapped I/O), IMIO(IO Mapped I/O)가 주류지만 리눅스 시스템에서는 파일/디렉토리로 모든 것을 가능하게 해 놓았죠. 이미 디바이스 드라이버란 이름이 있지만 MMIO, IMIO, PMIO(Port mapped I/O) 처럼 FMIO(File Mapped I/O)라고 하고 싶습니다.




PIN 번호 참조

https://wiki.odroid.com/odroid-xu4/hardware/expansion_connectors
odroid-xu4:hardware:expansion_connectors [ODROID Wiki]



wiki.odroid.com

0. 결과

https://youtu.be/Ifztgr99bRs


ODROID CON10 header의 핀번호는 인터넷에서 구할 수 있는 표번호와 다르다. 전에 한 학생이 다시 그려서 줬는데 구글 드라이브를 쓰기 전이라 잃어버렸다. 진작에 포스팅 할껄 하는 아쉬움이 남는다 그런데 넌(그 학생) 지식공유를 위해 블로그 하래두 안하니... 마음 편하게 확장 보드를 구매하자.



1. FMIO in shell

odroid@odroid-server:~$ echo 29 > /sys/class/gpio/export

odroid@odroid-server:~$ echo out > /sys/class/gpio/gpio29/direction

odroid@odroid-server:~$ echo 1 > /sys/class/gpio/gpio29/value



2. FMIO with source

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h> 




int main(int argc, char** argv)

{

FILE *fp;

char setValue[4];

int toggle = 0; 

if((fp = fopen(“/sys/class/gpio/export”, “ab”)) == NULL) {

printf(“Cannot open export file.\n”);

return -1;

}

rewind(fp);

strcpy(setValue, “1”);

fwrite(&setValue, sizeof(char), 1, fp);

fclose(fp);

sleep(1);

if((fp == fopen(“/sys/class/gpio/gpio25/value”, “rb+”)) == NULL) {

printf(“Cannot open value file. \n”);

return -1;



rewind(fp);

strcpy(setValue, “0”);

fwrite(&setValue, sizeof(char), 1, fp);

fclose(fp);

return 0;

}



3. FMIO using WiringPI

#include <stdio.h>

#include <wiringPi.h>

#include <sys/time.h>

int main(int argc, char **argv) {

unsigned int delay_cnt=0;

wiringPiSetup();

pinMode(06,OUTPUT);

digitalWrite(06,HIGH);

return 0;

}

https://wiki.odroid.com/odroid-xu4/application_note/gpio/wiringpi
odroid-xu4:application_note:gpio:wiringpi [ODROID Wiki]



wiki.odroid.com





ODROID에는 PWM이 없습니다. 각도 제어 서보모터의 경우 delay를 이용하여 S/W 파형을 만들어도 떨림없이 제어가 잘 되네요. 물론, 100%(모든 서보모터)는 아니고맥심칩처럼 컨버터를 넣은 보조 회로가 필요합니다.


뭐든 추상화하면 상위단 코드는 간결해집니다. 또, 알고리즘이나 다지인 패턴같이 좀 더 낫다고 생각되는 과제를 고민할 수 있게 됩니다. 임베디드 월드와 비교해 볼 때, 데스크톱에서 하는 응용 프로그램이야 정말 생각한 대로 작동한다고 할 수 있습니다. 응용프로그래머는 그렇게 추상화시킨 API를 사용할 때 정말 수많은 엔지니어가 많은 고생을 했었다는 사실을 잊지 말았으면 합니다.

'블로그 항해 일지 > Embedded' 카테고리의 다른 글

x86용 부트코드  (0) 2019.01.08
ODROID GPS 모듈 입양 完  (2) 2019.01.08
GPIO 제어 via 블루투스 on 삼성폰  (0) 2019.01.08
블루투스 연결  (0) 2019.01.08
Ubuntu Image download  (0) 2019.01.08


라즈베리 파이와 경쟁할 국내 기술의 뛰어난 제품, 오드로이드!

기본적으로 밑에 단 작업이 다 되어 있는 운영체제, 우분투 16.04를 받아보자.

1. 이미지 받기 전 eMMC 카드 포멧

다음 명령어를 이용하여 포멧해야 한다. on Windows®

C:\> Diskpart
DISKPART> list disk
DISKPART> select disk (id)
DISKPART> online disk (if the disk is not online)
DISKPART> attributes disk clear readonly
DISKPART> clean
DISKPART> convert mbr (or gpt)
DISKPART> create partition primary
DISKPART> select part 1
DISKPART> active (if this is the boot partition)
DISKPART> format fs=ntfs label=(name) quick
DISKPART> assign letter (letter)
DISKPART> list volume


2. Win32 Disk Imager for ODROID 이용, 다운로드

마그넷 링크 원본은 이 글 가장 아래에...

마그넷 다운로드를 위한 비트 토렌트 다운로드

Disk Image 마그넷

Ubuntu 16.04 Image 마그넷


3. 부팅 확인

* 주의 *

1. USB 허브 비추

2. 앞쪽 USB 포트 비추(메인보드에 직접 꽂으세요-전력문제 배제-)


Disk Image


magnet:?xt=urn:btih:22394D44F7E369D838CC63470387F1415C95A031&dn=win32diskimager2-binary.zip&tr=udp%3a%2f%2ftracker.openbittorrent.com%3a80%2fannounce&tr=udp%3a%2f%2ftracker.opentrackr.org%3a1337%2fannounce


Ubuntu mate 16.04 


magnet:?xt=urn:btih:2F97C2B4265EB528A72FCE8BD5FF11886FF63BAD&dn=ubuntu-16.04-mate-odroid-xu4-20170731.img&tr=udp%3a%2f%2ftracker.openbittorrent.com%3a80%2fannounce&tr=udp%3a%2f%2ftracker.opentrackr.org%3a1337%2fannounce




'블로그 항해 일지 > Embedded' 카테고리의 다른 글

x86용 부트코드  (0) 2019.01.08
ODROID GPS 모듈 입양 完  (2) 2019.01.08
GPIO 제어 via 블루투스 on 삼성폰  (0) 2019.01.08
블루투스 연결  (0) 2019.01.08
GPIO 컨트롤  (0) 2019.01.08

+ Recent posts