Category Archives: 날파리

[rasp.] spi 통신 설정

Rasp. 와 FPGA 사이의 통신으로 SPI를 사용하기로 결정했다.

SPI Clock이 최대 32Mhz까지 나오는 놀라운 장면을 목격했다.

 

i2c와 마찬가지로 spi 또한 설정하기 위해서는 blacklist에서 spi를 빼줘야 한다.

sudo vi /etc/modprobe.d/raspi-blacklist.conf 에서 아래와 같이 수정한다.

# blacklist spi and i2c by default (many users don't need them)

 

#blacklist spi-bcm2708

#blacklist i2c-bcm2708

blacklist snd-soc-pcm512x

blacklist snd-soc-wm8804

그리고, sudo reboot

아래와 같이 python-spi를 위한 필요파일을 받아 설치한다.

mkdir python-spi

cd python-spi

wget https://raw.github.com/doceme/py-spidev/master/setup.py

wget https://raw.github.com/doceme/py-spidev/master/spidev_module.c

sudo python setup.py install

이러면 완성..

 

아래는 시험 코드.

 

시험코드에 빠진 것이 있는데 spi 속도를 올리기 위해선 다음을 추가해야한다.

spi.max_speed_hz = 32000000

 

 

시험한 코드—-

#!/usr/bin/python

 

import spidev

 

spi = spidev.SpiDev()

spi.open(0,0)

 

while 1:

 

        r = spi.xfer2([0xAA,0x55,0xAA,0x55])

 

출력 결과 : 커플링이 좀 있지만 나름 나쁘지 않은 파형이네 ㅎㅎ

[python] Socket TCP/IP 통신 설정

음..

 

현재 꾸미고 있는 환경은 대충 아래 그림과 같다.

 

Application Program과 Rasp. 가 wifi로 통신을 해야 한다.

많은 양의 통신이 이루어 질 것으로 보이는데 뭐 어쨌든.. 

python으로 간단한 socket program을 작성하여 개발 환경을 구축했다.

 

Rasp. = Server / Application = Client 이다. 

 

Server —–

 

Client —-

 

개념은 아래와 같다. 

 

Rasp.은 항상 Application(이하 App.)의 명령을 기다린다. 

App.이 특성 요청을 보내면 Rasp.은 이 명령을 defetch 해서 명령을 수행하고 적절한 데이터를 App.에 전송한다.

App. 은 특정 요청에 대한 결과를 받아 GUI 로 표시한다.

[rasp.] GPIO 설정 (RPi vs. wiringPi)

Raspberry Pi B+ 와 FPGA를 연결할 계획에 있다. 

두 보드 간 통신을 위해 어떤 걸 사용할까 하다가.

GPIO를 이용한 parallel protocol을 직접 만들어 보려고 했다. 

그런데, GPIO의 속도가 그리 좋지 않았다. 

blog를 찾아 보니 language 별로 속도를 벤치마킹한 사이트가 있으니 링크를 참조.

http://codeandlife.com/2012/07/03/benchmarking-raspberry-pi-gpio-speed/

 

처음에는 기본 제공 하는 RPi GPIO 설정을 하려고 했는데.. 속도가 생각보다 별로 였다. 약 100kHz 정도

 

Blog에 보면 wiringPi가 속도가 괜찮다고 해서 굳이 wiringPi를 설치하여 속도를 확인해 봤다.

근데 역시.. python에서 사용을 해서 그런지 속도가 많이 나지 않는군… C로 하면 빠른 거 같은데.. 

이미 project 진행을 python으로 하기로 했으므로 pass~

 

아래 사진은 RPi.GPIO를 사용했을 때, wiringPi를 사용했을 때의  GPIO 실험 코드와 결과이다. 

 

RPi.GPIO

import RPi.GPIO as GPIO

 

GPIO.setmode(GPIO.BCM)

GPIO.setup(17,GPIO.OUT,initial=1)

GPIO.setup(17,GPIO.OUT)

GPIO.output(17,0)

while 1 :

    GPIO.output(17,0)

    GPIO.output(17,1)

 
 
 
다음은 wiringPi

import wiringpi

 

io = wiringpi.GPIO(wiringpi.GPIO.WPI_MODE_GPIO)

io.pinMode(17,io.OUTPUT)

io.digitalWrite(17,io.HIGH)

io.digitalWrite(17,io.LOW)

while 1:

    io.digitalWrite(17,io.LOW)

    io.digitalWrite(17,io.HIGH)

 

[rasp.] 지자기 센서(Digital Compass) HMC5883L

지자기 센서 예제

그 활용은 알아서~

 

import smbus

import time

from ctypes import c_short

 

bus = smbus.SMBus(1)

 

DEV_ADDR = 0x1E # for compass

 

# identification chip

 

id1 = bus.read_byte_data(DEV_ADDR,10)

id2 = bus.read_byte_data(DEV_ADDR,11)

id3 = bus.read_byte_data(DEV_ADDR,12)

 

print "ID 1 : ", hex(id1)

print "ID 2 : ", hex(id2)

print "ID 3 : ", hex(id3)

 

#CRA Registor Setting

bus.write_byte_data(DEV_ADDR,0,0×70)

#CRB Registor Setting

bus.write_byte_data(DEV_ADDR,1,0xA0)

#MODE Registor Setting

bus.write_byte_data(DEV_ADDR,2,0×00)

 

time.sleep(.100)

 

while 1 :

        x_axis_m = bus.read_byte_data(DEV_ADDR,3)

        x_axis_l = bus.read_byte_data(DEV_ADDR,4)

 

        z_axis_m = bus.read_byte_data(DEV_ADDR,5)

        z_axis_l = bus.read_byte_data(DEV_ADDR,6)

 

        y_axis_m = bus.read_byte_data(DEV_ADDR,7)

        y_axis_l = bus.read_byte_data(DEV_ADDR,8)

 

        bus.write_byte_data(DEV_ADDR,3,0×00)

 

        x = (c_short((x_axis_m << 8)+ x_axis_l).value)

        y = (c_short((y_axis_m << 8)+ y_axis_l).value)

        z = (c_short((z_axis_m << 8)+ z_axis_l).value)

        print "COMP : %6d %6d %6d"% (x,y,z)

        time.sleep(.01)

 

[rasp.] 기압 센서 BMP085 설정

기압 센서를 이용해 현재 온도와 기압, 해발고도를 측정할 수 있다.

 

#!/usr/bin/python 

 

import smbus

import time

from ctypes import c_short

from ctypes import c_uint32

 

bus = smbus.SMBus(1)

 

DEV_ADDR = 0x77

 

#CALIBRATION DATA ADDR

AC1M = 0xAA

AC1L = 0xAB

AC2M = 0xAC

AC2L = 0xAD

AC3M = 0xAE

AC3L = 0xAF

AC4M = 0xB0

AC4L = 0xB1

AC5M = 0xB2

AC5L = 0xB3

AC6M = 0xB4

AC6L = 0xB5

B1M = 0xB6

B1L = 0xB7

B2M = 0xB8

B2L = 0xB9

MBM = 0xBA

MBL = 0xBB

MCM = 0xBC

MCL = 0xBD

MDM = 0xBE

MDL = 0xBF

 

# get calibraion data

AC1_m = bus.read_byte_data(DEV_ADDR,AC1M)

AC1_l = bus.read_byte_data(DEV_ADDR,AC1L)

AC1 = (AC1_m << 8) + AC1_l

AC1 = c_short(AC1).value

AC2_m = bus.read_byte_data(DEV_ADDR,AC2M)

AC2_l = bus.read_byte_data(DEV_ADDR,AC2L)

AC2 = (AC2_m << 8) + AC2_l

AC2 = c_short(AC2).value

AC3_m = bus.read_byte_data(DEV_ADDR,AC3M)

AC3_l = bus.read_byte_data(DEV_ADDR,AC3L)

AC3 =( AC3_m << 8 )+ AC3_l

AC3 = c_short(AC3).value

AC4_m = bus.read_byte_data(DEV_ADDR,AC4M)

AC4_l = bus.read_byte_data(DEV_ADDR,AC4L)

AC4 =( AC4_m << 8) + AC4_l

AC4 = c_short(AC4).value

AC5_m = bus.read_byte_data(DEV_ADDR,AC5M)

AC5_l = bus.read_byte_data(DEV_ADDR,AC5L)

AC5 =( AC5_m << 8) + AC5_l

AC5 = c_short(AC5).value

AC6_m = bus.read_byte_data(DEV_ADDR,AC6M)

AC6_l = bus.read_byte_data(DEV_ADDR,AC6L)

AC6 =( AC6_m << 8) + AC6_l

AC6 = c_short(AC6).value

B1_m = bus.read_byte_data(DEV_ADDR,B1M)

B1_l = bus.read_byte_data(DEV_ADDR,B1L)

B1 = (B1_m << 8) + B1_l

B1 = c_short(B1).value

B2_m = bus.read_byte_data(DEV_ADDR,B2M)

B2_l = bus.read_byte_data(DEV_ADDR,B2L)

B2 = (B2_m << 8) + B2_l

B2 = c_short(B2).value

MB_m = bus.read_byte_data(DEV_ADDR,MBM)

MB_l = bus.read_byte_data(DEV_ADDR,MBL)

MB = (MB_m << 8) + MB_l

MB = c_short(MB).value

MC_m = bus.read_byte_data(DEV_ADDR,MCM)

MC_l = bus.read_byte_data(DEV_ADDR,MCL)

MC = (MC_m << 8) + MC_l

MC = c_short(MC).value

MD_m = bus.read_byte_data(DEV_ADDR,MDM)

MD_l = bus.read_byte_data(DEV_ADDR,MDL)

MD = (MD_m  <<8)+ MD_l

MD = c_short(MD).value

 

print "AC1 : ", AC1

print "AC2 : ", AC2

print "AC3 : ", AC3

print "AC4 : ", AC4

print "AC5 : ", AC5

print "AC6 : ", AC6

print "B1  : ", B1

print "B2  : ", B2

print "MB  : ", MB

print "MC  : ", MC

print "MD  : ", MD

 

 

# READ Sensor

 

bus.write_byte_data(DEV_ADDR,0xF4,0x2E)

time.sleep(.01)

UT_m = bus.read_byte_data(DEV_ADDR,0xF6)

UT_l = bus.read_byte_data(DEV_ADDR,0xF7)

UT = (UT_m << 8) + UT_l

 

print "UT : ", UT

 

oss = 3

bus.write_byte_data(DEV_ADDR,0xF4,(0x34+(oss<<6)))

time.sleep(.018)

UP_m = bus.read_byte_data(DEV_ADDR,0xF6)

UP_l = bus.read_byte_data(DEV_ADDR,0xF7)

UP_x = bus.read_byte_data(DEV_ADDR,0xF8)

UP = ((UP_m << 16) + (UP_l << 8) + UP_x) >> (8-oss)

 

print "UP : ", UP

 

X1 = (UT-AC6)*AC5>>15

X2 = (MC << 11) / (X1+MD)

B5 = X1 + X2

T = (B5 + 8) >> 4

 

print "T : ", T # temperature

 

B6 = B5 – 4000

X1 = (B2*(B6*(B6>>12)))>>11

X2 = AC2 * B6>>11

X3 = X1 + X2

B3 = ((AC1*4+X3)<<oss+2)>>2

X1 = AC3 * B6 >> 13

X2 = (B1*(B6*B6>>12))>>16

X3 = ((X1+X2)+2)>>2

B4 = AC4 * (c_uint32(X3+32768).value)>>15

B7 = (c_uint32(UP).value – B3)*(50000>>oss)

if B7<0x80000000 :

        p = (B7*2)/B4

else :

        p = (B7/B4)*2

 

X1 = (p>>8) * (p>>8)

X1 = (X1 * 3038) >> 16

X2 = (-7357 * p) >> 16

 

p = p + ((X1 + X2 + 3791)>>4)

 

print "p : ",p # pressure

 

p0 = 101325 # 일반적으로 쓰이는 해수면 기준 hpa

k = float(float(p)/float(p0))

kk = float(1 – pow(k,0.190295))

altitude = float(44330) * kk

 

print "Altitude : ",altitude # 해발고도