MULTIIO

5 minute read

소개

multiio_only
[Picture 1] MULTIIO


ODROID-M1S와 결합할 수 있는 보드 입니다.
/boot/config.ini 에서 필요한 인터페이스를 선택해서 작성하고,
핀 위치를 확인해서 사용하는 부분을 개선하기 위해 만들어 졌습니다.
한번에 모든 인터페이스를 사용하고, multiio 보드에 인터페이스를 명시했습니다.

MULTIIO 사용하기

다음은 MULTIIO 사용 방법 및 설명입니다.

MULTIIO 시작하기

먼저 ODROID-M1S와 MULTIIO 보드를 준비합니다.
전원을 연결하지 않은 채로 M1S 보드와 MULTIIO 보드를 결합합니다.

multiio_only
[Picture 2] m1s and multiio


공식 사이트에서 M1S의 우분투 이미지를 다운로드 한 후,
M1S의 emmc에 flash 하고 부팅합니다.

M1S의 /boot/config.ini 을 아래와 같이 수정합니다.

[generic]
#default_console=ttyFIQ0
overlay_resize=16384
overlay_profile=
overlays="board_multiio"
 
[overlay_custom]
overlays="i2c0 i2c1"
 
[overlay_hktft32]
overlays="hktft32 ads7846"


reboot 합니다.

MULTIIO 인터페이스

multiio 보드는 canfd , gpio , i2c 등 다양한 인터페이스를 제공합니다.

gpio

multiio_gpio
[Picture 3] multiio gpio


간단하게 gpio로 제어할 수 있는 센서나 디바이스들을 테스트할 수 있습니다.
sys 번호는 14번이며, root 권한으로 제어할 수 있습니다.

$ echo 14 | sudo tee /sys/class/gpio/export

INPUT

$ echo in | sudo tee /sys/class/gpio/gpio14/direction
$ cat /sys/class/gpio/gpio14/value

OUTPUT

$ echo out | sudo tee /sys/class/gpio/gpio14/direction
$ echo [1|0] | sudo tee /sys/class/gpio/gpio14/value

i2c

i2c는 간단하기도 하고, 다른 예제가 Wiki에서 제공 되고 있습니다.
Wiki를 참고하는 것이 좋을 것 같습니다.

input-device

multiio_keypad
[Picture 4] multiio keypad


multiio 보드는 키패드를 지원합니다.
이 키패드를 사용해서 여러 응용프로그램을 만들 수 있을 것입니다.
evtest 를 통해서 키패드를 동작시켜 보겠습니다.

evtest 설치합니다.

$ sudo apt install evtest


keypad 가 어떤 디바이스인지 확인합니다.

$ ls -l /dev/input/by-path/platform-key_pad-event
lrwxrwxrwx 1 root root 9 Nov 10 01:09 /dev/input/by-path/platform-key_pad-event -> ../event2


event2 에서 evtest 를 진행합니다.

$ sudo evtest --grab /dev/input/event2
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "key_pad"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 28 (KEY_ENTER)
    Event code 103 (KEY_UP)
    Event code 105 (KEY_LEFT)
    Event code 106 (KEY_RIGHT)
    Event code 108 (KEY_DOWN)
Key repeat handling:
  Repeat type 20 (EV_REP)
    Repeat code 0 (REP_DELAY)
      Value    250
    Repeat code 1 (REP_PERIOD)
      Value     33
Properties:
Testing ... (interrupt to exit)


키패드를 누를 때마다 이벤트가 출력되는지 확인합니다.

rtc

multiio_rtc
[Picture 5] multiio rtc


rtc는 M1S에 내장되어 있지만, multiio도 지원합니다.
그래서 multiio의 rtc를 사용하려면, 기본으로 사용되고 있는 rtc에서 multiio의 rtc로 스위칭 해야 합니다.
코인은 별도 구매입니다.

다른 여러 방법이 있겠지만, 저는 systemd 를 사용해서 부팅할 때마다 rtc를 선택하고 자동으로 실행하게 만들겠습니다.

먼저 udev rules를 작성합니다.

$ echo "KERNEL==\"rtc1\", TAG+=\"systemd\"" | sudo tee /etc/udev/rules.d/50-rtc.rules


서비스를 정의해 줍니다.

$ sudo vi /lib/systemd/system/hwrtc.service
[Unit]
Description=Synchronise System clock to hardware RTC
DefaultDependencies=no
Wants=dev-rtc1.device
After=dev-rtc1.device
Before=systemd-journald.service time-sync.target sysinit.target shutdown.target
Conflicts=shutdown.target
 
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/hwclock --hctosys --rtc=/dev/rtc1 -v --utc --noadjfile
RestrictRealtime=yes
 
[Install]
WantedBy=sysinit.target


Unit 파트에서 dev-rtc1.device 는 디바이스 노드 /dev/rtc1 을 뜻합니다.

서비스를 활성화 합니다.

$ sudo systemctl enable hwrtc
$ sudo reboot


리부팅 후, 서비스 상태를 확인합니다.

$ sudo service hwrtc status
_ hwrtc.service - Synchronise System clock to hardware RTC
     Loaded: loaded (/lib/systemd/system/hwrtc.service; enabled; vendor preset: enabled)
     Active: active (exited) since Fri 2023-11-10 01:39:26 UTC; 2min 4s ago
    Process: 316 ExecStart=/sbin/hwclock --hctosys --rtc=/dev/rtc1 -v --utc --noadjfile (code=exited, st>
   Main PID: 316 (code=exited, status=0/SUCCESS)

Nov 10 01:39:26 server hwclock[316]: Using the rtc interface to the clock.
Nov 10 01:39:26 server hwclock[316]: Assuming hardware clock is kept in UTC time.
Nov 10 01:39:26 server hwclock[316]: Waiting for clock tick...
Nov 10 01:39:26 server hwclock[316]: ...got clock tick
Nov 10 01:39:26 server hwclock[316]: Time read from Hardware Clock: 2023/11/10 01:39:26
Nov 10 01:39:26 server hwclock[316]: Hw clock time : 2023/11/10 01:39:26 = 1699580366 seconds since 1969
Nov 10 01:39:26 server hwclock[316]: Time since last adjustment is 1699580366 seconds
Nov 10 01:39:26 server hwclock[316]: Calculated Hardware Clock drift is 0.000000 seconds
Nov 10 01:39:26 server hwclock[316]: Calling settimeofday(NULL, 0) to lock the warp_clock function.
Nov 10 01:39:26 server hwclock[316]: Calling settimeofday(1699580366.000000, NULL) to set the System tim>
lines 1-16/16 (END)...skipping...


rtc는 다음의 명령어를 사용할 수 있습니다.

$ sudo hwclock -[r|s|w]

spi

multiio_spi
[Picture 6] multiio spi


multiio 보드는 spi 인터페이스 역시 제공합니다.
기본으로 spidev를 제공하며, dtb에서 사용하고자 하는 spi 디바이스 드라이버로 교체해서 사용할 수 있습니다.

$ ls /dev/spidev0.0
/dev/spidev0.0

pwm

multiio_pwm1
[Picture 7-1] multiio pwm


pwm 인터페이스를 지원합니다. pwm의 경우 외부 전원을 사용해야 합니다.
다만 pwm를 사용하는 주변 기기의 경우, 사양에 따라 보드를 손상시킬 수 있습니다.


multiio_pwm2
[Picture 7-2] multiio pwm example


pwm 예제로 모터를 smart power3 와 사용하기는 했지만,
이 사진은 외부 전원을 모터에 공급할 수 있는 간단한 예제 입니다.
실제로 smart power3 를 전원으로 사용 시 주의해야 합니다.

높은 출력의 모터를 사용할 경우에는 반드시 스펙에 맞는 모터드라이버를 따로 사용해 주어야 합니다.
외부 전원 역할을 한 smart power3 도 적절하지 않습니다.
고스펙의 모터를 사용할때에는 외부 전원으로 높은 출력을 가진 SMPS나 리튬 배터리, power supply등 을 사용하시기 바랍니다.


rs232

multiio_rs232
[Picture 8] multiio rs232


컴퓨터의 USB-to-Serial Cable 과 연결 가능 합니다.
hardware flow control 역시 지원합니다.
cts-rts 라인을 끊었다가 연결하면서 hardware flow control 테스트가 가능합니다.

디바이스 노드를 확인합니다.

$ ls /dev/ttyS?
/dev/ttyS0


rs232 동작 명령어 입니다.

$ sudo stty -F /dev/ttyS0 9600 -cstopb -parenb

# receive
$ cat /dev/ttyS0

# transmit
$ echo "123" | sudo tee /dev/ttyS0


canfd

multiio_canfd
[Picture 9] multiio canfd


보시다 시피, canfd 모듈을 추가로 사용해야 합니다.
그리고 multiio에서 canfd를 사용하기 위해서는 /boot/config.ini 를 아래와 같이 수정해야 합니다.

[generic]
#default_console=ttyFIQ0
overlay_resize=16384
overlay_profile=
overlays="board_multiio board_multiio_canfd"
 
[overlay_custom]
overlays="i2c0 i2c1"
 
[overlay_hktft32]
overlays="hktft32 ads7846"


can device를 확인합니다.

$ lsmod
mcp251xfd              32768  0
can_dev                24576  1 mcp251xfd

눈치 빠른 사람들은 알거 같습니다만, M1S에는 native canfd가 있습니다.
multiio는 mcp2517 칩이 on-board 되어있는 canfd-module을 사용합니다.

그 이유는, 개발 단계에서 어떤 문제가 발생했었던게 첫번째 이유입니다.
두번째는 canfd-module이 호환되게끔 만들고 싶었습니다.
그리고 세번째는 핀 위치상 CAN 채널을 2개까지 가져갈 수 있는 이점이 있습니다.
다만 문제가 해결되는 대로, 그리고 CAN 2채널의 이점이 없다고 판단이 되면, 원가 절감을 통한 가격 경쟁력 강화를 위해 다음 릴리즈에는 CAN-FD가 native can으로 대체 될 수도 있습니다.

oled

multiio_oled1
[Picture 10-1] multiio oled


multiio에서 oled모듈을 사용하기 위해서는 /boot/config.ini 를 아래와 같이 수정해야 합니다.

[generic]
#default_console=ttyFIQ0
overlay_resize=16384
overlay_profile=
overlays="board_multiio board_multiio_oled"
 
[overlay_custom]
overlays="i2c0 i2c1"
 
[overlay_hktft32]
overlays="hktft32 ads7846"


리부팅 합니다.

$ sudo reboot


multiio_oled2
[Picture 10-2] multiio oled on


부팅 직후의 모습입니다.

히스토리 (출시 전 개발 단계)

MULTIIO는 간단해 보이는 보드지만, 디버깅 하고 테스트하는게 쉽지는 않았습니다.
출시되기 이전 릴리즈가 있었습니다.

multiio_20230719
[Picture 11-1] multiio 20230719


현재 20230810 버전과 모습이 많이 다릅니다.
옆에 두고 비교하면 차이가 확연히 보입니다.

multiio_compare
[Picture 11-2] 0719 vs 0810


rtc 코인은 작아지고 canfd는 mcp2517을 사용하면서 option으로 바뀌었습니다.
디버깅을 진행하면서 여러가지 신경을 많이 썼습니다.

아래는 구버전에서 디버깅 하면서 찍은 사진들 입니다.

multiio_debug1
[Picture 12-1] multiio_debug 1


multiio_debug2
[Picture 12-2] multiio_debug 2


2번째 사진은 추후에 포스팅할 M1S stepper 보드의 일부 기능을 테스트 하기위해 multiio 일부 회로를 땡겨쓰면서 찍은 사진입니다.

처음에는 호기롭게 한번에 모든 인터페이스를 사용해보자! 로 시작했었습니다.
아이디어 좋았고 시장에도 존재하지 않고 정말 좋다고 생각했고 지금도 좋다고 생각합니다만..
디버깅 하는 과정이랑 출시 직전에 테스트는 어우.. 많기때문에 과정이 너무 험난했습니다

그래도 이렇게 출시 된 모습을 보니까 엄청 뿌듯합니다!?

끝으로.. 많은 구매 부탁드립니다
구매는 여기 입니다.

Leave a comment