라즈베리파이에서 디폴트로 SPI가 비활성화 되어있기 때문에 활성화 시켜주는 작업이 필요합니다. 다음 포스팅을 참고하세요..
[임베디드/Raspberry Pi] - Raspberry Pi 2/3에서 SPI 사용하기
라즈베리파이 보드와 아두이노를 다음처럼 연결해줍니다.
Raspberry Pi 2/3 Arduino UNO
(MOSI) 19 ------ 11(MOSI)
(MISO) 21 ------ 12(MISO)
(SCK) 23 ------ 13(SCK)
GND 6 ------ GND
아두이노 IDE에 다음 코드를 복사한 후, 아두이노에 업로드 시켜줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <SPI.h> char buf [100]; volatile byte pos = 0; volatile boolean printIt = false; #define spi_enable() (SPCR |= _BV(SPE)) void setup (void) { //시리얼 통신 초기화 Serial.begin (9600); //Master Input Slave Output 12번핀을 출력으로 설정 pinMode(MISO, OUTPUT); //slave 모드로 SPI 시작 spi_enable(); //인터럽트 시작 SPI.setClockDivider(SPI_CLOCK_DIV64); //250kHz SPI.setDataMode(SPI_MODE0); SPI.attachInterrupt(); } // SPI 인터럽트 루틴 ISR (SPI_STC_vect) { // SPI 데이터 레지스터로부터 한바이트 가져옴 byte c = SPDR; //버퍼에 자리가 있다면... if (pos < sizeof buf) { buf[pos++] = c; // 출력을 진행한다. if (c == '\0') printIt = true; } } void loop (void) { if (printIt) { buf[pos] = 0; Serial.println (buf); pos = 0; printIt = false; } } | cs |
라즈베리파이에서 다음 코드를 컴파일 시켜 줍니다.
1 | pi@raspberrypi:~ $ gcc spi_test.c -o spi_test | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #include <stdint.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <getopt.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/types.h> #include <linux/spi/spidev.h> #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) static void pabort(const char *s) { perror(s); abort(); } static const char *device = "/dev/spidev0.0"; static uint8_t mode; static uint8_t bits = 8; static uint32_t speed = 250000; static uint16_t delay; static void transfer(int fd, char* tx, int len) { int ret; uint8_t rx[256]; struct spi_ioc_transfer tr = { .tx_buf = (unsigned long)tx, .rx_buf = (unsigned long)rx, .len = len, .delay_usecs = delay, .speed_hz = speed, .bits_per_word = bits, }; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message"); for (ret = 0; ret < len; ret++) printf("%c", rx[ret]); puts("\n"); } int main(int argc, char *argv[]) { int ret = 0; int fd; fd = open(device, O_RDWR); if (fd < 0) pabort("can't open device"); /* * spi mode */ ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); if (ret == -1) pabort("can't set spi mode"); ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); if (ret == -1) pabort("can't get spi mode"); /* * bits per word */ ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); if (ret == -1) pabort("can't set bits per word"); ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits); if (ret == -1) pabort("can't get bits per word"); /* * max speed hz */ ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); if (ret == -1) pabort("can't set max speed hz"); ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); if (ret == -1) pabort("can't get max speed hz"); printf("spi mode: %d\n", mode); printf("bits per word: %d\n", bits); printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000); char buf[]="echo test"; transfer(fd, buf, ARRAY_SIZE(buf)); close(fd); return ret; } | cs |
아두이노 IDE의 메뉴에서 도구 - 시리얼 모니터를 선택하여 시리얼 모니터를 실행시켜 놓고 라즈베리파이에서 컴파일한 프로그램을 실행시켜줍니다.
라즈베리파이에서 실행한 프로그램은 "echo test" 문자열을 spi를 이용해 아두이노로 전송 후, 종료합니다.
시리얼 모니터를 보면 "echo test" 문자열이 출력된 걸 볼 수 있습니다.
라즈베리 파이에서 "echo test" 문자열을 SPI를 이용해서 아두이노로 보내면 , 아두이노는 해당 문자열을 받아 시리얼로 보내어 시리얼 모니터에 "echo test"가 출력되게 됩니다.
'Raspberry Pi > Raspberry Pi 활용' 카테고리의 다른 글
mjpg-streamer를 사용한 웹 스트리밍을 OpenCV에서 가져오기 (17) | 2018.10.30 |
---|---|
Raspberry Pi에서 mjpg-streamer를 사용하여 웹캠 스트리밍하기 (93) | 2018.10.28 |
Raspberry Pi 2/3에서 SPI 사용하기 (7) | 2016.11.29 |
Raspberry PI 2 /3 와 atmega128를 연결하여 SPI 테스트 (문자열 전송) (9) | 2016.06.29 |
raspberry pi 3에서 dht-22로부터 온도와 습도 읽어 출력하기 (10) | 2016.06.21 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!