콘텐츠로 바로가기

now0930 일지

이런저런 생각

  • 홈
  • 비공개
  • 강좌
  • 잔여 작업 조회
  • 위치

sensehat 온도 + LED matrix(2)

제한된 화면에 온도, 습도를 어떻게 표시할까 고민하다, 디바이스를 2개를 만들로 했다. 사용자가 디바이스 개수를 제한 없이 만들 수 있는 점이 좋다. 2개를 만들어 온도로 한 개, 습도로 한 개를 할당 했다.

위 그림에서 사용자가 rs-tmpre1를 읽어(read) module이 저장한 HTS221 온도 관련 레지스터 값을 얻는다. 사용자가 받은 값으로 온도를 계산한 후 LED Matrix를 빨강으로 설정하고, 커널로 쓴다(write). 사용자가 rs-tempre2를 읽어(read) module이 저장한 HTS221 습도 관련 레지스터 값을 얻는다. 역시 받은 값으로 습도를 계산하고, LED Matrix를 녹색으로 설정, 커널로 쓴다(write). 사용자 프로그램이 일정 주기로 계속한다.

LED Matrix가 숫자를 보여주는 방식이 너무 촌스럽다. 좀 개선해야 겠다.

  1. 부팅
  2. 내가 만든 모듈 로딩
  3. 사용자 프로그램 실행

1 ~ 3번을 자동으로 하고 싶었다. 이게 좀 까다롭다. 처음에는 간단하게 crontab으로 @reboot로 설정했으나, 실패했다. 모듈이 올라가기 전에 사용자 프로그램이 실행된다. 찾던 중 udev가 이벤트를 감지(디바이스 추가, 삭제)하여 사용자 정의 행동을 한다고 알았다.

udev에 등록하려면 디바이스 정보를 알아야 된다. 왜 class로 추가하는지 느꼈다. 인터넷 검색으로 다음과 같이 알아냈다.

pi@raspberrypi:~ $ udevadm info /dev/rs-tmpre1
P: /devices/virtual/rpi-sensehat/rs-tmpre1
N: rs-tmpre1
L: 0
E: DEVPATH=/devices/virtual/rpi-sensehat/rs-tmpre1
E: DEVNAME=/dev/rs-tmpre1
E: DEVMODE=0666
E: MAJOR=235
E: MINOR=0
E: SUBSYSTEM=rpi-sensehat

pi@raspberrypi:~ $ udevadm info /dev/rs-tmpre2
P: /devices/virtual/rpi-sensehat/rs-tmpre2
N: rs-tmpre2
L: 0
E: DEVPATH=/devices/virtual/rpi-sensehat/rs-tmpre2
E: DEVNAME=/dev/rs-tmpre2
E: DEVMODE=0666
E: MAJOR=235
E: MINOR=1
E: SUBSYSTEM=rpi-sensehat

pi@raspberrypi:/dev $ udevadm info -a -n /dev/rs-tmpre1

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/virtual/rpi-sensehat/rs-tmpre1':
    KERNEL=="rs-tmpre1"
    SUBSYSTEM=="rpi-sensehat"
    DRIVER==""
    ATTR{power/control}=="auto"
    ATTR{power/runtime_active_time}=="0"
    ATTR{power/runtime_status}=="unsupported"
    ATTR{power/runtime_suspended_time}=="0"

아래 스크립트와 같이 사용자 정의 rules를 만들면 전원이 들어가면서 실행됨을 확인 했다.

pi@raspberrypi:/etc/udev/rules.d $ pwd
/etc/udev/rules.d
pi@raspberrypi:/etc/udev/rules.d $ cat 100-sensehat.rules 
ACTION=="add", SUBSYSTEM=="rpi-sense-tmpre", KERNEL=="rs-tmpre2", RUN+="/bin/sensehat_display"

아쉽게도 udev로 등록한 프로세가 오래 못산다. 이벤트가 끝나면 process가 죽는다. systemctl로 서비스 형식으로 등록해야 한다. 참조하여 아래와 같이 설정했다. 잘 된다. 이제 LED matrix를 어떻게 해 봐야겠다.

pi@raspberrypi:/etc/systemd/system $ cat sensehat_display.service 
[Unit]
Description=SenseHat Temperatur & Humidity Monitor

[Service]
Type=simple
ExecStart=/usr/bin/sensehat_display

[Install]
https://github.com/now0930/sensehat_toy

참조 사이트

  • stack over flow
  • writing udev rule for USB device
  • How to daemonize a process or service with Systemd

이 글 공유하기:

  • Tweet
발행일 2022-02-21글쓴이 이대원
카테고리 생활코딩 태그 c, hts221, i2c, kernel, led2472g, linux, systemctl

댓글 남기기응답 취소

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.

글 내비게이션

이전 글

자가격리 중 이도류 수련

다음 글

서버 재설치 feat. docker

2025 5월
일 월 화 수 목 금 토
 123
45678910
11121314151617
18192021222324
25262728293031
4월    

최신 글

  • common mode, differential mode 2025-05-11
  • signal conditioner, 신호 처리기 2025-05-10
  • strain gage 2025-05-09
  • 칼만 필터 2025-05-01
  • positioner(I/P) 2025-04-26

카테고리

  • 산업계측제어기술사
  • 삶 자국
    • 책과 영화
    • 투자
  • 생활코딩
    • LEGO
    • ROS
    • tensorflow
  • 전기기사
  • 피아노 악보

메타

  • 로그인
  • 엔트리 피드
  • 댓글 피드
  • WordPress.org

페이지

  • 소개
  • 잔여 작업 조회
    • 작업 추가
    • 작업의 사진 조회
    • 작업 수정 페이지
  • 사진
    • GPS 입력된 사진
    • 사진 조회
  • 위치
    • 하기 휴가 방문지
    • 해외 출장

태그

android bash c docker driver FSM gps java kernel LEGO linux mysql network program opcua open62541 plc programmers python raspberry reinforcementLearning ros state space system program tensorflow transfer function 경제 미국 민수 삼국지 세계사 실기 에너지 역사 유전자 일본 임베디드 리눅스 전기기사 조선 중국 채윤 코딩 테스트 통계 한국사 한국어

팔로우하세요

  • Facebook
now0930 일지
WordPress로 제작.
 

댓글 로드중...