2015년 12월 30일 수요일

Raspberry Pi USB audio dongle 사용방법

date : 2015-12-30

RasPi Version : Jessie
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.4.0-rc7-v7+ #831 SMP PREEMPT Mon Dec 28 19:14:55 GMT 2015 armv7l GNU/Linux

usb audio : http://www.aliexpress.com/item/External-sound-card-High-Quality-USB-2-0-Mic-Speaker-Audio-mircophone-Converter-Sound-Card-Adapter/32428906009.html?spm=2114.01020208.3.320.qqEcd6&ws_ab_test=searchweb201556_1,searchweb201644_2_79_78_77_82_80_62_81,searchweb201560_4

USB audio 를 사용하면 깨끗한 음질을 들을 수 있다는... 사용해 보기로 했다.
하지만 결론 적으로 그닥 고품질은 아니다.

처음 usb audio dongle을 연결하면 다음과 같이 장치가 보이는지 확인한다.

pi@raspberrypi:~ $ lsusb
Bus 001 Device 007: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller
Bus 001 Device 005: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter
Bus 001 Device 008: ID 413c:2106 Dell Computer Corp. Dell QuietKey Keyboard
Bus 001 Device 006: ID 13ee:0003 MosArt Optical Mouse
Bus 001 Device 004: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

pi@raspberrypi:~ $ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0


위와 같이 장치는 보이지만, 활성화 가 안되는 문제가 있다.

인터넷 자료를 보면, 아래와 같은 파일의 내용을 수정해  usb audio 를 활성화 하는 방법이 있는데,
/usr/share/alsa/alsa.conf
/lib/modprobe.d/aliases.conf

https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=124016&p=871926#p871926

제시하는 방법을 수행하면 usb로 audio를 사용할 수 있다. 하지만, 재부팅 시 .asoundrc 파일의 card 파라메터가 원래 값으로 되돌아가는 문제가 있다. 다른 방법을 써가며 수십번 해 봤지만 모두 결과는 같았다.

마지막으로 찾은 해결책이 있는데, 이 문제는 버그로 인해 usb audio 가 활성화 되지 않는 것이었고, bug fix 버전의 volumealsa.so 파일을 아래의 사이트 에서 를 다운로드 받은 후 현재 의 파일에 덮어 쓰고, 재부팅 하면 문제가 해결된다.
https://github.com/RPi-Distro/repo/issues/9

이 사이트 에서 다운받은 파일을 다음과 같이 덮어쓴다.
덮어쓰기 전 백업 받아 두는것을 잊지 않도록 한다.

sudo cp /usr/lib/arm-linux-gnueabif/lxpanel/plugins/volumealsa.so ~/volumealsa.so.org
sudo cp volumealsa.so /usr/lib/arm-linux-gnueabif/lxpanel/plugins/volumealsa.so


결론 : usb audio 를 사용 하고자 한다면 volumealsa.so 에 현재 버전에 버그가 있으니 패치를 한 후 사용한다.

2015년 12월 24일 목요일

Build Raspberry pi to a laptop with official 7" lcd screen

라즈베리파이 정품 7" 터치스크린을 이용한 랩탑 만들기.


대충 이렇게 생긴걸 만들었다. 접었다 폈다 할 수 있는데, 노트북이라고 하기에는 좀...  두툼한 탭 같은...

아... 정말 블로그 만드는거 보고서 만드는것 만큼 귀찮구 힘드네요. 진행 내용중 궁금 하신 분들 질문 하면 자세히 내용 보강하는걸로...


이거 출력하고 싶으면 -> BearMAX3D Print

준비물 :
Raspberry Pi 2 : 1ea
Memory : 32G(samsung)
Wifi : usb dongle
keyboard & mouse : wireless

기본적인 라즈베리파이 외 아래와 같이 추가 부품이 필요하다.

1. 30cm ffc 15 pins 1.0mm pitch Flat Ribbon Flex Cable
http://www.aliexpress.com/item/Free-shipping-30cm-ffc-15-pins-1-0mm-pitch-Flat-Ribbon-Flex-Cable-15pin-20624-AWM/32345634817.html

2. laptop speaker 8R 1W 8ohm 1W 1635 16*35MM
http://www.aliexpress.com/item/Brand-new-laptop-speaker-8R-1W-8ohm-1W-1635-16-35MM/32354929856.html

3. 1pcs PAM8610 2x15W amplifier board 
http://www.aliexpress.com/item/1pcs-PAM8610-2x15W-amplifier-board-digital-two-channel-stereo-power-amplifier-board-miniature/32466368355.html

4. switch

5. 12V AC/DC adapter

6. 8.4V dc/dc step down buck(I'll use adjustable buck)

7. 5V dc/dc step down buck

8. 18650 litum ion battery x 2 (7.4V) included RE/Discharge protection circuit module

9. Barrel jack

10. Raspberry pi Official 7inch touch screen.
http://kr.element14.com/raspberry-pi/raspberrypi-display/raspberry-pi-7inch-touchscreen/dp/2473872/?&&CMP=KNC-GOO-RPI-Touch-screen&mckv=s|pcrid|54926581677&gclid=CjwKEAiAhaqzBRDNltaS0pW5mWgSJADd7cYD-RPkB1ilTkfTkg78UgWage4q_3A7-IjNbxAijRcrFBoCmgjw_wcB

11. HDMI to D-SUB converter cable for dual monitor (I am not sure if it is working ;)
http://www.aliexpress.com/item/1pcs-Video-Converter-HDMI-Male-to-VGA-RGB-Female-HDMI-to-VGA-Cable-1080P-for-PC/32451157972.html?spm=2114.01020208.3.11.Lvjvnb&ws_ab_test=searchweb201556_1_79_78_77_82_80_62,searchweb201644_0,searchweb201560_4


12. N4001 diod x 2



아래 사진은 3d print 파트 조립 방법인데, 아직 수정할게 많이 있는것 같다. 일단, Version 1 으로 조립하는 단계를 설명한다.



프린팅된 부품은 다섯가지 이다.

1.본체 body_bottom
2. 본체 덮개 body_lid
3. 힌지 베이스 hinge_base
4. 힌지 슬라이드 lcd_hinge1, lcd_hinge2
5. LCD 뒷덮개개 lcd_back_cover 

hinge_baseV1.1 파트를 아래 사진과 같이 연결하고(방향성이 있음.), 볼트로 조인다.
hinge_base는 2개이므로 좌/우 모두 조립한다.


18650 배터리는 보호회로가 있는것으로 준비한다.
7.4V 이상 필요하므로 직렬로 연결.
배터리 연결부는 참치캔을 전지 가위로 오려서 만든다. 참치캔 안쪽은 코팅이 되어 있으니, 사포로 벗겨낸다. 손조심 해야한다.
잘라낸 철 조각을 배터리의 접접으로 사용한다.
요렇게, 배터리 접점으로 구부려서 만든다.

하우징 은 오렌지 와 검은색 두 개를 출력했는데, 오렌지색 제작시 사진을 많이 찍어놓은게 없어서 대부분 검정색 으로 설명해야 하겠다.


8.4V dc/dc 변환기( buck, 가변 기능 있는것 ) 와 배터리를 배치 해 본다.
Barrel jack 은 dc/dc buck in 에 연결.  아래의 구성도를 참조 한다.


회로도 처음 그려봤다. KiCad 라는 걸 처음 써봄.

전원 스위치 조립.

위의 회로도를 참조하여 아래와 같이 다이오드 2개를 연결.


8.4V dc/dc step down buck 조립을 끝내고,

 5V dc/dc step down  연결 및 ampfilter  연결.
 라즈베리파이의  audio jack  뒷면에 있는 단자와 ampfilter  연결.


Audio 연결선 : 노란선이 left, 파란선이 right 
대충 이렇게 배치된다. 

듀얼모니터를 쓰기위해 hdmi-to-Dsub 변환기 장착. 

 DSI flat cable 도 연결하고.
 회색선은 LCD 전원선

 캡톤 테이프로 정리좀... 하고 

본체 조립 완성. 


덮개를 덮는다.


뒷테...

일단, 본체조립은 여기서 끝이고, LCD 조립인데,  블랙용 LCD 를 수리 보냈다...
수리 마치고 되돌아오면 다시 정리 하여 완성 하기로 하고...

오렌지로 완성된 사진을...

이렇게 쓰면 됨.



무선 키보드 / 마우스 사용.

2015년 5월 23일 토요일

대문열기 라즈베리파이 + Mini PN532 NFC 리더

라즈베리파이 + NFC 리더 를 이용한 대문열기.

개요 : NFC리더를 통해 스마트폰 또는 RFID 태그 의 UID 를 읽어들여 등록된 UID 인지 검증 후 문을 여는 동작을 한다.

장점 : 열쇠 없이 대문 열기

단점 : 정전시 집에 못들어감, 라즈베리파이에 문제 발생시 집에 못들어감.

하드웨어 준비

준비물 : 라즈베리파이 1개
PN532 NFC 리더 1개
NFC housing : 3D printing    http://www.thingiverse.com/thing:845134
NFC housing 3D 프린트를 원하면 클릭!! 3D Print
인터폰선(4선식) 인터폰 -> 대문 까지.
릴레이 : 1개
다이오드 : 1개
트랜지스터 BC337 : 1개 
저항 1K옴 : 1개

그림1. 전체 회로도


릴레이 부분 확대 사진.


인터폰 에서 대문까지 인터폰선을 연결(본인 집은 약 35미터), 프린팅한 하우징에 PN532 Reader를 장착하고 대문 인터폰 주변에 부착함.
좀 멀어서 통신에 문제가 있지 않을까 걱정 했지만 잘 작동함.




코딩 

NFC Library 설치 : http://gaeranking.blogspot.kr/2015/05/nfc.html 를 참조.

디렉터리 구조 : 

실행파일 
/usr/local/bin
/usr/local/bin/doornfc  >  NFC reader로 부터 수신대기.
/usr/local/bin/dooropen.py  > GPIO 제어하고 문을 연다.
/usr/local/bin/dooropen  > dooropen.py를 호출
/usr/local/bin/addnfc-uid.sh  > NFC UID 정보 수집을 위한 script, 읽은 데이터는
/var/nfc/uid.data에 저장한다.

데이터파일 
/var/nfc/uid.data  > UID 정보를 보관하는 파일.


1. uid.data 파일 만들기

$ sudo mkdir /var/nfc
$ sudo touch /var/nfc/uid.data
$ sudo chown pi /var/nfc/uid.data


2. 실행 스크립트 작성.

$ cat dooropen.py
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)
GPIO.output(23, True)
time.sleep(0.2)
GPIO.output(23, False)
GPIO.cleanup()
time.sleep(1)
print ("OK")


$ cat dooropen
sudo python /usr/local/bin/dooropen.py 


$ cat addnfc-uid.sh 
#!/bin/bash
echo "Touch your NFC Device to reader"
NFCUID=`nfc-poll | grep UID`
CHECK_DOUBLE=`grep "$NFCUID" /var/nfc/uid.data`
if [ ${#CHECK_DOUBLE} -gt 0 ] ; then
   echo "Your UID is already registered"
else
   echo "$NFCUID" >> /var/nfc/uid.data
   echo "UID registered."
   exit 0
fi


$ cat doornfc
#!/bin/bash

echo $$ > /var/run/doornfc.pid

while [ true ]
do

#  Reading UID from NFC tag
RESULT=`nfc-poll|grep UID`
#echo NFC-READ:$RESULT

if [ ${#RESULT} -eq 0 ]; then
   echo "no data from NFC Reader try again..."
else
   CHECK=`grep "$RESULT" /var/nfc/uid.data`
   echo CHECK-DB:$CHECK

   echo LENGTH_OF_CHECK=${#CHECK}

   if [ ${#CHECK} -gt 0 ]; then
      dooropen
   fi

fi
done


NFC등록

addnfc-uid.sh 를 실행 후 NFC Reader 에 스마트폰 또는 RFID 태그 접촉.

$ addnfc-uid.sh 
Touch your NFC Device to reader
nfc_initiator_target_is_present: Target Released
UID registered.

cat /var/nfc/uid.data 에 방금 접촉한 태그의 UID가 등록 되었다.


릴레이 작동해 보기

등록된 UID 로 릴레이가 작동 하는지 확인해 보자. doornfc 를 실행.

$ /usr/local/bin/doornfc 


NFC Reader에 스마트폰이나 RFID 태그 를 접촉 시키면 릴레이 에서 "딸깍" 하는 소리가 나면 정상 작동 하는것.


2015년 5월 9일 토요일

라즈베리파이 NFC 사용

Step 1. NFC Reader 준비.
 NFC리더는 UART 사용을 위해 점퍼를 0 0 으로 설정 (본인 구매 제품은 땜질 되어 있음)
사진 좌측 상단에

1         1
s0      s1
0        0

으로 인쇄되어 있는데, 사진처럼 s0 + 0, s1 + 0 땜질 되어 있으면  0 0 임,


NFC 리더와 라즈베리파이는 다음과 같이 연결한다.
NFC tx ---> Rpi pin10 (UART rx)
NFX rx ---> Rpi pin8 (UART tx)
송/수신이 바뀔경우 아래와 같이 nfc-poll 을 실행할 경우 에러가 발생한다.(nfc-poll은 Step 1 에서 실행 할 수 없음.)
pi@doorpi ~/libnfc-1.7.1/examples $ sudo ./nfc-poll
/home/pi/libnfc-1.7.1/examples/.libs/lt-nfc-poll uses libnfc 1.7.1
error    libnfc.chip.pn53x    Unexpected PN53x reply!
error    libnfc.driver.pn532_uart    pn53x_check_communication error
lt-nfc-poll: ERROR: Unable to open NFC device.

pinout 에 대한 자세한 정보는 google 에서 검색 해 보시라...


Step 2. 라즈베리파이 UART 통신 enable
기본설정으로 라즈베리파이의 UART는 시스템의 Serial console 용으로 설정되어 외부 장치의 입/출력을 받을 준비가 되어 있지 않다. 아래의 절차를 통해 외부 입/출력이 가능하도록 수정한다.
pi@doorpi ~ $ sudo raspi-config





 8 Advanced Options 선택.


 A8 Serial 선택.


 <No> 선택



 <OK> <Finish>

Raspberry Pi 재부팅.

Step3. libnfc 컴파일


https://bintray.com/nfc-tools/sources/libnfc  에서


libnfc-1.7.1.tar.bz2 를 다운로드.

pi@doorpi ~ $ mkdir libnfc 
pi@doorpi ~ $ cd libnfc/ 
pi@doorpi ~ $ cp libnfc-1.7.1.tar.bz2 ~/libnfc/
pi@doorpi ~ $ bzip2 -d libnfc-1.7.1.tar.bz2
pi@doorpi ~ $ tar -xvf libnfc-1.7.1.tar
libnfc-1.7.1/
libnfc-1.7.1/install-sh
libnfc-1.7.1/CMakeLists.txt
libnfc-1.7.1/aclocal.m4
libnfc-1.7.1/INSTALL
-- snip --

conf 디렉터리 만들고 conf 파일 복사.

pi@doorpi ~ $ mkdir -p /etc/nfc/devices.d

pi@doorpi ~ $ cd libnfc-1.7.1/

sudo cp contrib/libnfc/pn532_uart_on_rpi.conf.sample /etc/nfc/devices.d/pn532_uart_on_rpi.conf
sudo nano /etc/nfc/devices.d/pn532_uart_on_rpi.conf
줄 맨 마지막에  아래의 내용을 추가
allow_intrusive_scan = true

아래와 같이 된다.
pi@doorpi ~ $ cat /etc/nfc/devices.d/pn532_uart_on_rpi.conf
## Typical configuration file for PN532 device on R-Pi connected using UART
## Note: to use UART port on R-Pi, you have to disable linux serial console:
##   http://learn.adafruit.com/adafruit-nfc-rfid-on-raspberry-pi/freeing-uart-on-the-pi
name = "PN532 board via UART"
connstring = pn532_uart:/dev/ttyAMA0
allow_intrusive_scan = true



라즈베리파이를 재부팅.

pi@doorpi / $ sudo reboot


pi@doorpi ~/libnfc-1.7.1 $ sh ./configure --with-drivers=pn532_uart --sysconfdir=/etc --prefix=/usr
fatal: Not a git repository (or any of the parent directories): .git
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for style of include used by make... GNU
--snip --

Selected drivers:
   acr122_pcsc...... no
   acr122_usb....... no
   acr122s.......... no
   arygon........... no
   pn53x_usb........ no
   pn532_uart....... yes
   pn532_spi.......  no
   pn532_i2c........ no

pn532_uart 를 사용하도록 되었는지 확인.

pi@doorpi ~/libnfc-1.7.1 $ sudo make clean
Making clean in test
make[1]: Entering directory '/home/pi/libnfc-1.7.1/test'
test -z "" || rm -f
test -z "" || rm -f
rm -rf .libs _libs
test -z "" || rm -f
rm -f *.o
--snip --


pi@doorpi ~/libnfc-1.7.1 $ sudo make install all
Making install in libnfc
make[1]: Entering directory '/home/pi/libnfc-1.7.1/libnfc'
Making install in chips
make[2]: Entering directory '/home/pi/libnfc-1.7.1/libnfc/chips'
  CC     libnfcchips_la-pn53x.lo
  CCLD   libnfcchips.la
make[3]: Entering directory '/home/pi/libnfc-1.7.1/libnfc/chips'
--snip --



nfc-poll 을 실행 한 후 리더에 스마트 폰이나 nfc 를 접촉하면 데이터 가 수신된다.
pi@doorpi ~/libnfc-1.7.1 $ cd examples/
pi@doorpi ~/libnfc-1.7.1/examples $ ./nfc-poll
/home/pi/libnfc-1.7.1/examples/.libs/lt-nfc-poll uses libnfc 1.7.1
NFC reader: pn532_uart:/dev/ttyAMA0 opened
NFC device will poll during 30000 ms (20 pollings of 300 ms for 5 modulations)
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04 
       UID (NFCID1): e3  28  ca  de 
      SAK (SEL_RES): 08 
nfc_initiator_target_is_present: Target Released
Waiting for card removing...done.


이제 nfc-poll을 샘플삼아 내게 맞는 코딩을 작성하면 되겠다.

#### PN532 uart for raspberry pi 3 (2016/07/24)

Raspberry pi 3 에서 /dev/AMA0 는 bluetooth 를 위해 사용되고. GPIO를 통한 uart는 /dev/serial0 으로 바뀌었다.

/boot/config.txt 의 맨 마지막 줄에 다음과 같은 라인 추가.
core_freq=250
enable_uart=1

라즈베리파이 재부팅

/etc/nfc/devices.d/pn532_uart_on_rpi.conf  파일내 uart port 변경
pi@raspberrypi:~/libnfc-1.7.1/examples $ cat /etc/nfc/devices.d/pn532_uart_on_rip.conf
## Typical configuration file for PN532 device on R-Pi connected using UART
## Note: to use UART port on R-Pi, you have to disable linux serial console:
##   http://learn.adafruit.com/adafruit-nfc-rfid-on-raspberry-pi/freeing-uart-on-the-pi
allow_intrusive_scan=true
name = "PN532 board via UART"
connstring = pn532_uart:/dev/serial0

####  테스트
pi@raspberrypi:~/libnfc-1.7.1/examples $ ./nfc-poll
/home/pi/libnfc-1.7.1/examples/.libs/lt-nfc-poll uses libnfc 1.7.1
NFC reader: pn532_uart:/dev/serial0 opened
NFC device will poll during 30000 ms (20 pollings of 300 ms for 5 modulations)
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04
       UID (NFCID1): 83  b3  a6  ef
      SAK (SEL_RES): 08
nfc_initiator_target_is_present: Target Released
Waiting for card removing...done.