라즈베리 파이 아두 이노 시리얼 통신–당신이 알아야 할 모든

이 튜토리얼에서 나는 어떻게 라즈베리 파이와 직렬 통신을 통해 아두 이노 보드 사이에 통신하는 방법을 보여 드리겠습니다.

먼저 직렬 통신이 무엇인지 빨리 설명하겠습니다. 그럼 당신은 어떻게 설치에 하드웨어 및 소프트웨어를 볼 수 있습니다,우리는 파이썬 코드(아두 이노에 대한 비용 절감)에 뛰어들 수 있습니다. 기본 예 처음에는 라즈베리 파이,아두 이노 및 기타 전자 장치를 사용하여보다 완벽한 응용 프로그램을 선도.이 튜토리얼은 라즈베리 파이 4(이전:3 비,3 비+)보드 및 아두 이노 보드와 함께 작동합니다. 나는 주로 아두 이노 우노를 사용하지만 직렬 통신에 올 때 아두 이노 보드 사이의 차이점에 대한 자세한 내용을 제공합니다.

전자 장치로 작업 할 때 통신이 핵심입니다. 각 장치-그것이해야 할 일을 잘하는 것 위에-다른 장치와 명확하게 통신 할 수 있어야합니다. 이것은 매우 기본적인 응용 프로그램에서 더 복잡한 응용 프로그램으로 전환하기 위해 작업해야 할 가장 중요한 것 중 하나입니다.

목차

직렬 통신은 단순히 데이터를 전송하는 방법입니다. 데이터는 많은 비트가 동시에 전송되는 병렬 통신에 반하여 한 번에 한 비트(1 바이트=8 비트)로 순차적으로 전송됩니다.더 구체적으로,아두이노와 라즈베리 파이와 함께 시리얼을 사용할 때,당신은 아트 프로토콜을 사용하고 있습니다. “범용 비동기 수신 및 전송”을 의미합니다.

당신은 당신의 자신의 프로젝트를 구축하기 위해 라즈베리 파이를 사용하는 방법을 배우고있다?

초보자를위한 라즈베리 파이를 확인하고 단계별로 배웁니다.

기본적으로 직렬 통신을 기반으로 한 비동기 멀티 마스터 프로토콜로 2 개의 보드간에 통신 할 수 있습니다. 안심,당신을 위해 모든 낮은 레이어를 처리 할 라이브러리가 있습니다.

멀티 마스터는 연결된 모든 장치가 원하는 경우 데이터를 자유롭게 보낼 수 있음을 의미합니다. 이는 마스터 장치만 통신을 시작할 수 있는 마스터-슬레이브 프로토콜과의 주요 차이점 중 하나입니다. 예를 들어,하나의 아두 이노 보드와 여러 센서 또는 액추에이터가있는 경우.아두 이노 우노 보드(동시에 모두 함께 사용하지 마십시오)를 사용할 수 있습니다. 일부 보드는 더 많이 사용할 수 있습니다. 아두 이노 메가 다른 일련 번호(직렬,일련 번호 1,일련 번호 2,일련 번호 3)를 가지고 있으며,아두 이노 제로는(대신 직렬 직렬를 사용).

라즈베리 파이에서 많은 직렬 장치를 연결할 수 있습니다. 각각 다른 장치 이름을 갖습니다(이 자습서의 뒷부분에서 해당 장치를 찾는 방법을 살펴보겠습니다). 이 응용 프로그램은 당신이 당신의 장치 나 스포티 파이에서 음악을 섞는다.

당신은 이미 직렬 통신을 알고있을 것입니다

당신은 이미 직렬 통신을 여러 번 사용했습니다. 난 당신이 이미 당신이 당신의 코드에서 무슨 일이 일어나고 있는지 기록하고 사용자 입력을 얻을 수 있습니다 아두 이노 시리얼 라이브러리를 알고 확신합니다. 직렬 모니터를 사용하는 경우,음,기본적으로 아두 이노 이데는 아두 이노와 시리얼 통신을 시작합니다. 직렬 모니터에서 직접 데이터를 수신하고 보낼 수 있습니다.

우리가 여기서 할 것은 거의 동일하다,대신 아두 이노 이데의 것을 제외하고,직렬 통신의 다른 측면은 라즈베리 파이 보드가 될 것입니다. 우리는 몇 가지 설정을하고 작동 할 수 있도록 몇 가지 코드를 작성해야합니다. 그런 다음,라즈베리 파이와 아두 이노 모두 서로 메시지를 보낼 수 있습니다.

이제 두 보드를 물리적으로 연결하는 방법을 살펴 보겠습니다.

직렬 통신을위한 하드웨어 설정

직렬 통신을 위해 라즈베리 파이와 아두 이노를 연결하는 2 가지 방법이 있습니다.가장 쉬운 방법은 두 보드 사이에 케이블을 사용하는 것입니다.

라즈베리 파이 측면에서,간단한 커넥터는 당신이 필요로하는 모든 것입니다. 4 개의 포트 중 하나를 선택할 수 있습니다.아두 이노의 경우,당신은 당신이 당신의 보드에(아두 이노 아이디와 함께)컴퓨터에서 코드를 업로드하는 데 사용하는 포트를 사용합니다. 어떤 버전을 사용하느냐에 따라 달라집니다. 아두 이노 우노와 메가 같은 보드의 경우,커넥터는 아두 이노 나노 다른,그리고 아두 이노 제로에서 것입니다.

이 예에서는 아두 이노 우노 보드를 사용했습니다.

당신이 볼 수 있듯이,그것은 당신이 라즈베리 파이와 아두 이노 사이에 만들 수있는 간단한 하드웨어 연결입니다.

주: 먼저 컴퓨터에 아두 이노를 연결해야합니다,그래서 당신은 보드에 코드를 업로드 할 수 있습니다. 그 후,라즈베리 파이에 케이블을 연결합니다. 라즈베리 파이는이 케이블을 통해 아두 이노에 전원을 공급합니다.직렬 연결을 만들려면 라즈베리 파이 지피오스와 아두이노 핀 사이에 일반 전선을 사용할 수도 있습니다.

당신의 아두 이노 보드에 따라 당신은 전압 레벨 시프터를 사용해야 할 수도 있습니다. 때문에 같은 아두 이노 보드,101,그들은 또한 3.3 볼트를 사용하기 때문에 잘 될 것입니다.따라서,당신은 수신 및 송신(라즈베리 파이 핀과 아두 이노 우노 핀에 대한 자세한 정보)를 연결할 때 라즈베리 파이를 보호하기 위해 3.3 볼트/5 볼트 레벨 시프터가 필요합니다.

이 자습서의 나머지 부분에서는 설치 프로그램을 사용합니다. 이 응용 프로그램은 당신이 당신의 장치 나 스포티 파이에서 음악을 섞는다.

라즈베리 파이 소프트웨어 설치

당신은 아두 이노에 대한 특별한 설정이 필요하지 않습니다. 그냥 당신이 다운로드 및 아두 이노 아이디를 설치했는지 확인하십시오.

지금,당신의 라즈베리 파이에,몇 가지 통신 작업을 할 필요가 있습니다.

당신의 라즈베리 파이에 연결합니다. 당신이 당신의 컴퓨터에 설치하지 않은 경우,당신은 매우 쉽게 설치 할 수 있습니다.아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지 아두 이노 보드 감지

단순히ls /dev/tty*를 실행하고 당신은 그것을 볼 수 있습니다. 당신이 아두 이노 보드 인 장치 확실하지 않은 경우이 시점에서,단순히 보드를 분리(제거),다시ls /dev/tty*를 실행합니다. 이 방법 당신은 쉽게 아두 이노의 직렬 장치 이름을 발견 할 것이다.

직렬

에 대한 하드웨어 권한 또한 다음과 같은 오류를 피하기 위해 사용자를 다이얼 아웃 그룹에 추가 할 수 있습니다.직렬루틸.사용 권한이 거부되었습니다.’

$ sudo adduser your_username dialout

이것은 당신이 직렬 장치에 액세스 할 수 있는지 확인합니다.

당신이 전화 접속 그룹에 자신을 추가 한 후에는 변경 사항을 적용하려면 파이(또는 적어도 로그 아웃/로그인)를 다시 부팅해야–라즈베리 파이 하드웨어 권한에 대해 자세히 알아보십시오.

라즈베리 파이에 파이썬 시리얼 라이브러리를 설치

당신은 파이썬과 시리얼 인터페이스를 사용할 수 있도록 라이브러리를 설치해야합니다.

이 자습서에서는 파이썬 라이브러리(파이썬 3 에 대한 문서)를 사용합니다. 설치하려면:

python3 -m pip install pyserial

이 파이썬 라이브러리는 잘 알려져 있으며 많은 응용 프로그램에서 사용됩니다.설치 시”핍이라는 모듈이 없습니다.”와 같은 오류가 발생하면 먼저sudo apt install python3-pip로 핍을 설치해야합니다.

라즈베리 파이에 아두 이노에서 간단한 직렬 통신

의는 매우 간단한 프로그램을 시작하자.

아두 이노 코드

아두 이노 아이디를 사용하여,당신의 아두 이노에 컴퓨터에서이 코드를 업로드합니다.

void setup() { Serial.begin(9600);}void loop() { Serial.println("Hello from Arduino!"); delay(1000);}

먼저,우리는 초기화 직렬 통신,선택 전송 속도,여기에 9600. 9600 은 일반적으로 사용되는 전송 속도이며 매우 낮은 전송 속도입니다. 미래의 응용 프로그램에서 당신은 아무 문제없이 57600 또는 115200 의 전송 속도를 사용할 수 있습니다. 이 튜토리얼을 위해 우리는 9600 을 계속합니다.

매 초마다 우리는 아두 이노 직렬 문자열을 보낼 수 있도록.인쇄(). 이 함수는 문자열 끝에 줄 바꿈 문자를 추가합니다.

직렬 모니터를 열어 컴퓨터에서 문자열을 볼 수 있습니다.

라즈베리 파이 파이썬 코드

#!/usr/bin/env python3import serialif __name__ == '__main__': ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1) ser.flush() while True: if ser.in_waiting > 0: line = ser.readline().decode('utf-8').rstrip() print(line)

그래서이 코드는 무엇을합니까?

#!/usr/bin/env python3import serial

먼저 이전에 설치 한 직렬 라이브러리를 가져옵니다.

if __name__ == '__main__': ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)

직렬 통신은 직렬 호출에 의해 초기화됩니다.몇 가지 매개 변수와 함께 직렬():

  • 아두 이노의 직렬 장치 이름: 이 예제에서는 다음과 같이 설명합니다.
  • 전송 속도:이 매개 변수는 매우 중요합니다. 당신은 당신이 아두 이노에 사용 된 것과 동일한 전송 속도를 사용할 필요가,또는 다른 모든 것을 읽고 쓰레기가 될 것입니다 쓸 수 있습니다. 우리는 아두 이노 스케치에서했던 것처럼 그래서,우리는 9600 을 선택합니다.
  • 시간 초과:읽기 작업의 시간 초과입니다. 여기서 우리는 그것을 1 초로 설정합니다. 그것은 우리가 시리얼에서 읽을 때 데이터가 오지 않는 경우,프로그램이 영원히 붙어되지 않습니다 것을 의미한다. 1 초 또는 읽기 후에 모든 바이트가 수신되지 않으면 함수는 이미 수신 된 바이트를 반환합니다.

그래서,직렬.직렬()모든 직렬 작업에 사용할 수있는 개체를 반환. 우리는 그것을’빼앗아’변수에 저장합니다.

 ser.flush()

그런 다음 플러시()기능을 사용합니다. 이것은 모든 입력 및 출력 버퍼를 플러시하므로 통신 시작시 이상한/유용하지 않은/완전하지 않은 데이터를 수신하거나 보내는 것을 피할 수 있습니다.

 while True: if ser.in_waiting > 0: line = ser.readline().decode('utf-8').rstrip() print(line)

무한 루프(아두 이노 스케치의 루프()함수의 생각)에서 일부 데이터가 대기중인 속성과 함께 사용할 수 있는지 확인합니다(괄호를 넣지 마십시오.이 함수는 아닙니다). 그렇다면 데이터를 읽을 수 있습니다.

읽기 줄()함수는 줄 바꿈 문자가 감지 될 때까지 모든 바이트를 읽습니다.

우리가받은 것을 인쇄하면 우리는 아두 이노에서 비엘로를 볼 것입니다!”…….” 직렬에서 읽을 때 바이트를 받고 해당 바이트를 적절한 데이터 유형으로 변환(디코딩)해야합니다. 디코딩(‘아스키’)을 사용하여 수신 된 데이터를 문자열로 디코딩 할 수도 있습니다.그것은 당신이 어떤 후행 문자(개행,캐리지 리턴)를 제거 할 수 있습니다. 이 방법으로’\아르 자형’과’\엔’을 제거하고 적절한 문자열을 얻을 수 있습니다.

참고:여기서 우리는 매번 완전한 줄을 읽습니다. 일정량의 바이트(하나 이상)를 읽으려면 읽기(크기=1)기능을 사용하십시오.

테스트 직렬 통신

이제 컴퓨터에서 아두 이노 보드를 분리하고 라즈베리 파이 보드에 연결합니다.

아두 이노 코드는 전원이 켜지 자마자 이미 실행 중입니다.

라즈베리 파이에서 파이썬 파일을 실행 가능하게 만들어 실행합니다.

$ chmod +x receive_serial_data_from_arduino.py$ ./receive_serial_data_from_arduino.py Hello from Arduino!Hello from Arduino!Hello from Arduino!

작동! 매 초마다 아두 이노에 의해 전송 된 문자열은 라즈베리 파이 터미널에 표시됩니다.

라즈베리 파이와 아두 이노 사이의 양방향 직렬 통신

의 좀 더 흥미로운 일을 만들어 보자. 당신은 라즈베리 파이에 아두 이노에서 데이터를 전송하는 방법을 보았다. 이 부분에서는 아두 이노에 라즈베리 파이에서 이야기하는 방법을 볼 수 있습니다. 따라서 당신은 커뮤니케이션의 양측이 있고 당신은 서로의 입력을 기다리는 프로그램을 창조할 수 있을 것이다.

아두 이노 코드

void setup() { Serial.begin(9600);}void loop() { if (Serial.available() > 0) { String data = Serial.readStringUntil('\n'); Serial.print("You sent me: "); Serial.println(data); }}

아두 이노 직렬 데이터를 수신 한 경우 여기에서 우리는 확인합니다.유효한(). 이렇게 하면 수신 버퍼에 이미 도착하고 저장된 바이트 수가 표시됩니다.

일부 데이터가 도착한 경우 직렬을 사용합니다.다음 줄을 얻으려면 줄 바꿈 문자’\’를 사용하십시오. 이 기능은 다음과 같습니다. 모든 바이트가 자동으로 변환 아두 이노 문자열 객체에 추가 될 때까지 받았다.

그런 다음,우리는 단지 우리가받은 데이터를 다시 인쇄,텍스트의 추가 조각.

참고:바이트를 하나씩 읽으려면 시리얼로 읽을 수 있습니다.읽기()기능. 그런 다음 필요한 경우이 바이트,문자열 등을 변환해야합니다.

라즈베리 파이 파이썬 코드

#!/usr/bin/env python3import serialimport timeif __name__ == '__main__': ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1) ser.flush() while True: ser.write(b"Hello from Raspberry Pi!\n") line = ser.readline().decode('utf-8').rstrip() print(line) time.sleep(1)

아두 이노에 데이터를 전송하기 위해 직렬 함수 쓰기()를 사용합니다. 여기에서 보낼 문자열 앞에’비’를 추가 한 것을 볼 수 있습니다. 직렬을 통해서만 바이트를 보낼 수 있기 때문에 문자열을 바이트로 인코딩합니다. 바이트 또는 바이트 배열이 아닌 모든 데이터는 전송되기 전에 변환해야합니다. 당신은 단지 그런 문자열을 보내려고하면,당신은이 오류를 얻을 것이다”유형오류:유니 코드 문자열이 지원되지 않습니다,바이트로 인코딩하십시오:’안녕하세요 라즈베리 파이에서!'”

참고:ser.write(b"Hello from Raspberry Pi!\n")대신ser.write("Hello from Raspberry Pi!\n".encode('utf-8'))또는ser.write("Hello from Raspberry Pi!\n".encode('ascii'))을 쓸 수 있습니다. 이 같은 일을 할 것입니다. 인코딩()함수는 문자열을 가지고 직렬을 위해 인코딩합니다.

또한,우리는 개행 문자를 추가’\엔’그 아두 이노는 직렬 읽기를 종료 할 것으로 예상 무엇 때문에.(‘\엔’)까지 문자열 읽기.

그런 다음,우리는 우리가 전에했던 것과 같은 일을:우리는 줄을 읽고,문자열로 디코딩하고,후행 문자를 제거합니다. 우리는 이 약을 사용하지 않습니다.이 특정 응용 프로그램에 대한 우리는 아두 이노가 문자열을 수신 한 직후 일부 데이터를 다시 보낼 것을 알고 있기 때문에,여기에 대기. 또한,우리는이 줄에 붙어 피하기 위해 1 초 시간 제한이 있습니다.

마지막으로 수신 된 문자열을 인쇄하고 시간이 지남에 따라 1 초 동안 기다립니다.수면()시리얼을 통해 다음 문자열을 보내기 전에.

테스트 양방향 직렬 통신

당신의 라즈베리 파이에,당신의 파이썬 파일을 실행하고 실행합니다.

$ chmod +x bidirectional_serial_communication.py $ ./bidirectional_serial_communication.py You sent me: Hello from Raspberry Pi!You sent me: Hello from Raspberry Pi!You sent me: Hello from Raspberry Pi!

성공! 아두 이노는 문자열을 수신하고,몇 가지 더 단어로 다시 전송. 그런 다음 라즈베리 파이 수신 및 최종 문자열을 인쇄.

라즈베리 파이 아두 이노 직렬 통신:응용 프로그램 예

이제 당신은 어떻게 직렬 통신을위한 설정 아두 이노와 라즈베리 파이에 알고,각 보드 사이에 이야기 프로그램을 작성,좀 더 복잡한 응용 프로그램을 만들 수 있습니다.이 응용 프로그램은 아두 이노 보드에 연결됩니다.

라즈베리 파이와 아두 이노는 서로 이야기 직렬 통신을 사용하여 케이블로 연결됩니다.

우리가 얻고 싶은 결과는 다음과 같습니다.:

  • 푸시 버튼을 누르면,아두 이노는 라즈베리 파이(간단한 바이트)에 알림을 보내드립니다.
  • 라즈베리 파이는 1 과 4 사이의 임의의 정수를 계산하고,아두 이노에 보낼 것입니다.아두이노는 이 숫자와 관련된 전원의 전원을 켜고 다른 전원의 전원을 끕니다.

이것은 당신이 아두 이노와 라즈베리 파이 사이의 통신 및 작업의 동기화에 연습 할 것입니다.

이 튜토리얼의 지점에 도착하면(축하합니다!)아래에 제공된 코드를 읽기 전에 직접 코드를 작성하는 것이 좋습니다. 또한 이러한 요구 사항을 충족 할 수있는 가능한 코드가 하나뿐이므로 코드가 내 코드와 다를 수 있습니다. 당신은 아두 이노 직렬 참조 및 참조에서 도움을받을 수 있습니다.

회로도

이 회로를 만들려면:

  • 연결 4 핀 9-12. 더 긴 다리와 디지털 핀 사이에 각각 220 옴 저항을 추가하십시오. 짧은 다리는 땅에 연결되어 있습니다.
  • 접지(풀다운 저항)에 연결된 10 옴 저항이있는 푸시 버튼을 추가하십시오. 한 사이드 버튼 연결 5 볼트,다른 디지털 핀 5 독서.
  • 모든 구성 요소 사이에 공통점을 만드는 것을 잊지 마십시오. 당신이 적어도 정확하게 근거를 연결하지 않은 경우에 어떤 전력 공급든지 추가하지 마십시오.아두 이노와 라즈베리 파이를 연결합니다.

아두 이노 코드

#define LED_1_PIN 9#define LED_2_PIN 10#define LED_3_PIN 11#define LED_4_PIN 12#define BUTTON_PIN 5byte lastButtonState = LOW;byte currentButtonState = LOW;unsigned long lastButtonDebounceTime = 0;unsigned long buttonDebounceDelay = 20;void powerOffAllLEDs(){ digitalWrite(LED_1_PIN, LOW); digitalWrite(LED_2_PIN, LOW); digitalWrite(LED_3_PIN, LOW); digitalWrite(LED_4_PIN, LOW);}void setup(){ Serial.begin(9600); pinMode(LED_1_PIN, OUTPUT); pinMode(LED_2_PIN, OUTPUT); pinMode(LED_3_PIN, OUTPUT); pinMode(LED_4_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT); powerOffAllLEDs();}void loop(){ byte readValue = digitalRead(BUTTON_PIN); if (readValue != lastButtonState) { lastButtonDebounceTime = millis(); } if (millis() - lastButtonDebounceTime > buttonDebounceDelay) { if (readValue != currentButtonState) { currentButtonState = readValue; if (currentButtonState == HIGH) { Serial.write(18); } } } lastButtonState = readValue; if (Serial.available() > 0) { int ledNumber = Serial.read() - '0'; powerOffAllLEDs(); switch (ledNumber) { case 1: digitalWrite(LED_1_PIN, HIGH); break; case 2: digitalWrite(LED_2_PIN, HIGH); break; case 3: digitalWrite(LED_3_PIN, HIGH); break; case 4: digitalWrite(LED_4_PIN, HIGH); break; default: // wrong pin number, do nothing // all LEDs will be powered off break; } }}

설정()기능에서 우리는 모든 핀 모드를 초기화합니다. 우리는 또한 확인 모든 전원 오프.

그런 다음 루프()에서 푸시 버튼을 처리하고 4 개의 디딜 방아를 관리하는 두 가지 작업을 수행합니다. 두 작업 모두 하나씩 수행되지만 매우 빠르게 처리되므로 동시에 발생하는 것처럼 처리됩니다. 즉,아두 이노 프로그램을 멀티 태스킹의 경우입니다.

첫 번째 작업:푸시 버튼 처리.

byte readValue = digitalRead(BUTTON_PIN);if (readValue != lastButtonState) { lastButtonDebounceTime = millis();}if (millis() - lastButtonDebounceTime > buttonDebounceDelay) { if (readValue != currentButtonState) { currentButtonState = readValue; if (currentButtonState == HIGH) { Serial.write(18); } }}lastButtonState = readValue;

원치 않는 값을 피하기 위해 버튼을 디 바운스해야합니다. 우리는 버튼을 누르면 것을 발견 할 때,우리는 시리얼을 통해 라즈베리 파이에 일부 데이터를 보낼 수 있습니다.

여기서 연재물을 사용했습니다.쓰기()기능:바이트 또는 일련의 바이트를 보냅니다. 이 직렬 다르다.인쇄()직렬 모니터에서 볼 수있는 출력이 좋은 것. 우리가 인간이 아닌 다른 기계와 이야기 할 때,그 문제는 없습니다.

여기서 보내는 번호는 18 입니다. 이것은 우리가 상태”버튼을 눌렀다”와 연관됩니다 단지 임의의 숫자입니다,그래서 라즈베리 파이가 번호를 받게됩니다 때 18 과 동일의 경우,그것은 확인합니다. 다른 번호를 사용하여 직렬을 통해 다른 작업이나 메시지를 보내는 것을 상상할 수 있습니다.

참고:일반적으로 당신은 또한 버튼을 눌렀을 때 알고 아두 이노 인터럽트를 사용할 수 있습니다. 그렇게 할 경우 인터럽트에서 직렬 라이브러리를 사용하지 마십시오. 절대적으로 인터럽트를 사용해야하는 경우 인터럽트(간단한 부울 변수)내부에 플래그를 설정하고 루프()함수 내부에 직렬을 사용하십시오.

두 번째 작업:4 개의 디딜 방아를 관리합니다.

 if (Serial.available() > 0) { int ledNumber = Serial.read() - '0'; powerOffAllLEDs(); switch (ledNumber) { case 1: digitalWrite(LED_1_PIN, HIGH); break; case 2: digitalWrite(LED_2_PIN, HIGH); break; case 3: digitalWrite(LED_3_PIN, HIGH); break; case 4: digitalWrite(LED_4_PIN, HIGH); break; default: // wrong pin number, do nothing // all LEDs will be powered off break; } }

아두 이노는 직렬 통신을 통해 라즈베리 파이에서 일부 데이터를 수신 한 경우 먼저 우리는 확인합니다.

그렇다면 다음 바이트를 직렬로 읽습니다.읽기(). 여기서’0’으로 빼는 것으로 구성된 작은 트릭을 알 수 있습니다.이 트릭은 문자를 나타내는 숫자(이 경우 정수)로 변환합니다.

그 후에는 매우 간단합니다. 우리는 전원 오프 모든,다음 전원 만 주도 관련된 번호:1,2,3 또는 4. 잘못된 값이 전송되면 전원이 켜지지 않습니다.

라즈베리 파이 파이썬 코드

#!/usr/bin/env python3import serialimport randomif __name__ == '__main__': ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1) ser.flush() while True: number = ser.read() if number != b'': if int.from_bytes(number, byteorder='big') == 18: led_number = random.randint(1,4) print("Button has been pressed.") print("Sending number " + str(led_number) + " to Arduino.") ser.write(str(led_number).encode('utf-8'))

먼저 하나의 가져 오기 라인을 추가합니다.

무한 루프(“참”)에서 먼저 직렬에서 1 바이트를 읽습니다. 시간 제한은 1 초로 설정됩니다. 1 초 후에 아무 것도 수신되지 않으면 읽기()기능이 반환됩니다.

그래서 우리는 우리가받은 것이 단순히 비어 있는지(비”)또는 정말로 무언가가 있는지 확인합니다. 이 후자의 경우,우리는 우리가 코드에서 사용할 수 있도록 우리가 정수로받은 데이터를 변환. 이를 위해 우리는 함수를 사용합니다.18 의 16 진수 표현은 18 로 디코딩됩니다.

당신이 볼 수 있듯이 우리는 번호가 작업을 계속 18 인지 확인합니다. 처리해야 할 명령이 다른 경우 각 명령에 대해 다른 번호를 사용하는 것이 좋습니다.

우리는 전원을 주도 결정하기 위해 1 과 4 사이의 임의의 숫자를 선택합니다. 그런 다음 우리는 그것을 쓰기()함수와 함께 보냅니다. 우리는 먼저 그것을 문자열로 변환 한 다음 인코딩으로 인코딩합니다.응용 프로그램을 테스트

이제 아두 이노를 사용하여 라즈베리 파이에 연결할 수 있습니다. 라즈베리 파이는 다음 아두 이노와 4 개의 발광 다이오드 모두 전원을 공급합니다.

당신이 당신의 아두 이노에 연결된 많은 것들이있는 경우,당신은 아두 이노 전원 공급 장치 커넥터에 외부 전원 공급 장치를 추가 할 수 있습니다. 당신이 스테퍼 모터를 사용하려는 경우 예를 들어,라즈베리 파이는 자체+아두 이노+모터에 대한 충분한 전류가 없을 것입니다. 이 경우,와 4 그 괜찮습니다.

파이썬 스크립트를 실행하고 푸시 버튼을 누릅니다. 당신은 로그와 아두 이노에 주도 중 하나가 전원이 켜집니다 볼 수 있습니다.

$ chmod +x arduino_raspberry_pi_leds_button.py$ ./arduino_raspberry_pi_leds_button.py Button has been pressed.Sending number 3 to Arduino.Button has been pressed.Sending number 2 to Arduino.Button has been pressed.Sending number 4 to Arduino.Button has been pressed.Sending number 1 to Arduino.Button has been pressed.Sending number 3 to Arduino.Button has been pressed.Sending number 3 to Arduino.

버튼을 누를 때마다:

  • 아두 이노는 그것을 감지하고 라즈베리 파이(18)를 보낼 것입니다.
  • 라즈베리 파이는 시리얼에서 일부 데이터를 받게됩니다. 18 과 같은 수 있는지 확인합니다. 그렇다면 임의의 숫자(1-4 사이)가 선택됩니다. 라즈베리 파이는 아두 이노에이 번호를 보내드립니다.
  • 아두 이노는 관련 주도에이 번호와 전원을 받게됩니다.참고:빠르고 적은 코드로이 응용 프로그램을 수행하려면,당신은 또한 아두 이노에 라즈베리,스탠다드 피르 마타 라이브러리에 예를 들어 피르 마타 라이브러리를 사용하여,피르 마타 프로토콜을 사용하도록 선택할 수 있습니다. 자세한 내용은 그 자습서를 확인하십시오.

    결론

    이 튜토리얼에서 당신은 시리얼을 통해 라즈베리 파이와 아두 이노 보드 사이에 통신하는 방법을 배웠습니다.

    이제 실제 생활에서 이것이 당신에게 유용 할 것입니까? 대답은’예,그리고 꽤 자주.

    라즈베리 파이는 응용 프로그램에 포함 된 계산 능력을 많이 가지고 좋은 곳입니다. 당신은 많은 언어,웹 서버,로봇 공학 신청,등에 있는 완전한 소프트웨어를 달릴 수 있습니다. 아두 이노만큼 좋지 않습니다. 또한,당신은 당신이 하드웨어 뭔가 잘못 할 경우 파이를 구울 수있는 더 많은 기회가있다.

    아두 이노는 하드웨어 센서와 액추에이터를 직접 처리하는 데 더 적합합니다. -라즈베리 파이 대 아두 이노를 사용하는 경우에 대한 자세한 정보.

    모두 모두,2 보드는 완벽하게 함께 작업 할 수 있습니다:응용 프로그램의”뇌”로 라즈베리 파이,그리고”근육”으로 아두 이노,직렬 통신이 서로 이야기 할 수 있도록.