Go에서의 Raspberry Pi 코딩 : 신호등

최근에 Go 프로그래밍 언어를 배우고 있습니다 . 연습 으로 Go에서 다시 작성하기 위해 Python에서 Raspberry Pi의 신호등 작업을 살펴본 과거 기사 를 다시 검토하기로 결정했습니다 . 이를 독립형 가이드로 만들기 위해 여기에있는 이전 기사의 콘텐츠를 일부 재사용 할 것입니다. 이 기사를 작성한 이후로 Node.js ( 여기에 대해 읽기 ), Java ( 여기에서 시도 ), Node RED ( 기사 ), Bash 스크립팅 ( Bash 기사 ), Swift ( Swift 기사 )를 사용하여 동일한 연습을 작성했습니다. C ( 여기에서 확인하십시오 ) 및 Arduino ( Arduino 기사 ).

쇼핑리스트

이를 시도하려면 다음이 필요합니다 (여기 링크는 주로 Adafruit 로 이동합니다 . 영국 고객은 Pimoroni 를 영국 기반 대안으로 고려할 수 있으며 Amazon은이 모든 것이 아니지만 대부분이 있습니다).

  • 라즈베리 파이는 (여기 파이 3 모델 B를 사용 하겠지만, GPIO 핀 어떤 모델이 작동합니다 - 당신은 당신이 그것에 어떤 헤더를 납땜해야합니다 파이 제로를 사용하려는 경우). 40 핀이있는 Pi 2 또는 3이 있다고 가정하겠습니다.
  • 전원 공급 장치 당신의 파이를위한
  • 어떤 종류의 케이스 는 아마도 Pi를 보호하는 데 좋은 아이디어 일 것입니다 (하지만 조명을 연결하기 위해 GPIO 핀을 노출하려면 뚜껑을 열어 두어야합니다)
  • 마이크로 SD 카드 에 운영 체제를 설치 (또는 하나 얻을 사전 설치된 OS를 ). 운영 체제를 직접 설치하려면 SD 카드 리더가있는 Mac, PC, Linux 시스템이 필요합니다.
  • Low Voltage Labs신호등 세트 (2 개 팩은 좋은 가치)
  • Pi에 입력 할 모든 USB 키보드
  • Pi의 출력을 표시하는 모든 HDMI 디스플레이

Low Voltage Labs 신호등은 4 개의 핀을 사용하여 Pi에 연결됩니다. 이들 중 하나는 접지되어야하며 나머지 세 개는 개별 LED를 제어하는 ​​데 사용되는 실제 GPIO 핀입니다.

Pi의 전원을 켜기 전에 신호등을 연결하여 핀이 빨간색으로 강조 표시된 GPIO 핀에 연결되도록합니다.

pinout.xyz의 Raspberry Pi GPIO 핀아웃

완료되면 다음과 같이 보일 것입니다. (오른쪽에 있는지 확인하는 쉬운 방법은 하단에 USB 포트가있는 Pi를 볼 때 핀의 왼쪽 행에있는 표시등을 찾는 것입니다. 그런 다음 8 개의 핀을 세고 거기에 조명을 부착하십시오).

아직 Pi를 켜지 마십시오. 먼저 운영 체제 이미지를 준비해야합니다.

운영 체제 설정

공식 Raspberry Pi 사이트에서 다운로드 할 수있는 Raspbian Stretch Lite OS를 설치합니다 . 도움이 필요한 경우 훌륭한 설치 가이드를 찾을 수도 있습니다 . Resin.io 의 무료 Etcher 도구는 운영 체제 이미지를 마이크로 SD 카드로 전송할 때 도움이됩니다.

운영 체제를 설치했으면 로그인 할 수 있는지 확인하고 유선 또는 Wi-Fi 인터넷 연결이 구성되어 있는지 확인하십시오.

이제 계속해서 조명을 켜고 끌 수 있습니다!

Go 설치

Go 코드는 바이너리로 컴파일 및 배포 할 수 있으며 크로스 컴파일도 가능합니다 (컴파일러는 빌드 된 것과 다른 운영 체제 / 프로세서 아키텍처에서 실행되는 바이너리를 생성합니다). 여기에서 두 가지 옵션을 모두 살펴볼 것이므로 Raspbian Lite에 포함되지 않은 Go 배포판을 Pi에 설치해야합니다.

Go 설치는 배포판을 다운로드 한 다음 (Pi가 사용하는 최신 ARM v6 버전을 여기 에서 확인 ) 다음으로 확장 하는 간단한 문제입니다 /usr/local.

$ wget https://storage.googleapis.com/golang/go1.10.1.linux-armv6l.tar.gz
$ sudo tar -C /usr/local -xvf go1.10.1.linux-armv6l.tar.gz

PATH=$PATH:/usr/local/go/bin

$ . ~/.profile

$ rm go1.10.1.linux-armv6l.tar.gz

$ go version
go version go1.10.1 linux/arm

종속성 설치

Raspbian Lite와 함께 설치되지 않지만 추가하기 쉬운 git도 필요합니다.

$ sudo apt-get install git
$ git --version
git version 2.11.0

$ go get github.com/stianeikeland/go-rpio/...

~/go/src/github.com/stianeikeland/go-rpio

신호등 프로그래밍

마찬가지로 조명을 작동시키기 위해 패키지를 go get사용하는 예제 코드 go-rpio:

$ go get github.com/simonprickett/gopitrafficlights/...

$ cd ~/go/src/github.com/simonprickett/gopitrafficlights
$ go run main.go

코드를 바이너리 파일로 컴파일 한 다음 실행할 수도 있습니다.

$ go build -o trafficlights
$ ./trafficlights

작동 원리

다음은 전체 소스 코드에 대한 간략한 설명입니다.

프로그램은 라인 13에서 Pi의 GPIO 핀을 열 수 있는지 확인합니다. 열 수 없으면 종료됩니다. 19 ~ 26 행이 성공적이라고 가정하면 GPIO 핀 9, 10 및 11을보다 의미있는 변수 이름에 할당하고 Pi에게 출력 핀으로 사용하도록 지시합니다.

라인 28-39는 SIGTERM신호를 위한 채널을 설정합니다 .이 신호는 사용자가 조명을 보는 것에 지루해하고 Ctrl + C를 누를 때마다 프로그램으로 전송됩니다. 업 프로그램 설정 채널 종료 신호가 발생했을 때 통보를받을 것입니다, 다음 실행 goroutine goroutine 프로그램의 나머지 부분과 동시에 실행하고, 메시지 대기 채널로 전송하는 라인 31에 있습니다. 하나를 받으면 Ctrl + C를 눌렀 기 때문에 프로그램이 종료하려고합니다. 그런 다음 고 루틴의 코드는 모든 조명을 끄고 깨끗하게 종료됩니다.

정리의 일환으로 , 프로그램이 종료 될 때마다 발생하도록 defer 키워드를 사용하여 39 행에서 GPIO 핀과 관련된 리소스를 해제합니다 .

각 표시등은 관련 핀이 높게 설정되면 켜지고 낮게 설정되면 꺼집니다. 라인 42-44는 다른 것이 GPIO 핀을 이전에 사용하고 켜 놓은 경우를 대비하여 모든 표시등이 먼저 꺼져 있는지 확인합니다.

47 행에서 프로그램은 신호등에 대해 올바른 순서로 조명을 .High()켜고 끄는 무한 루프에 들어갑니다 .Low(). 단계 사이에서 time.Sleep실행을 일시 중지합니다.

크로스 컴파일

Go 도구 세트의 기능 중 하나는 코드를 바이너리 실행 파일로 크로스 컴파일 할 수 있다는 것입니다. 즉, 코드를 컴파일하는 플랫폼이 아닌 다른 플랫폼에 대한 바이너리를 만들 수 있습니다.

Go는이를 매우 간단하게 만듭니다. 예를 들어 Intel Mac OS 컴퓨터에서 신호등 예제 코드를 컴파일하고 Linux를 실행하는 ARM 기반 Raspberry Pi에서 실행되는 바이너리를 출력 할 수 있습니다. 이것은 컴파일 할 때 몇 가지 환경 변수를 설정하기 만하면됩니다.

$ go get github.com/stianeikeland/go-rpio/...
$ go get github.com/simonprickett/gopitrafficlights/...
$ cd ~/go/src/github.com/simonprickett/gopitrafficlights
$ env GOOS=linux GOARCH=arm GOARM=7 go build -o trafficlights

결과 trafficlights바이너리는 Raspberry Pi 3에서 작동하지만이를 컴파일 한 Mac OS 머신에서는 작동하지 않습니다. 이전 모델 Pi를 사용하는 경우 GOARM을 6으로 설정해야 할 수 있습니다. 사용해 보려면 컴파일 된 바이너리 trafficlights를 Pi로 FTP 한 다음 다음을 사용하여 시작하십시오.

$ ./trafficlights

Raspberry Pi, Go 또는이 둘의 조합으로 무엇을하고 있는지 듣고 싶습니다. 시간이되면 더 많이 써보도록하겠습니다.

Suggested posts

QEMU로 베어 메탈 저수준 커널 이미지 리버스 엔지니어링-시작하기

QEMU로 베어 메탈 저수준 커널 이미지 리버스 엔지니어링-시작하기

***이 튜토리얼은 베어 메달 리버스 엔지니어링 시리즈의 일부가 될 것입니다 *** 임베디드 시스템에 대한 호기심은 몇 대의 안드로이드 폰을 분해 한 이후로 커졌습니다. 임베디드 시스템 자체는 아니지만 전화가 결국 컴퓨터를 추월 할 것이라는 것을 알고있었습니다. 그래서 나는 그들에 대해 더 배우고 싶었습니다.

Go 및 Generics 사용

Go 및 Generics 사용

네, 일어나고 있습니다! Golang에 제네릭을 추가하라는 제안이 수락되었습니다. 이는 향후 일부 버전에서 빈 인터페이스 {}로 복잡한 해결 방법을 사용하지 않고도 일반 솔루션을 코딩 할 수 있음을 의미합니다.

Related posts

"실용적인 프로그래머"의 5 가지 필수 사항

역대 베스트셀러 코딩 북의 요점

"실용적인 프로그래머"의 5 가지 필수 사항

Pragmatic Programmer는 1999 년에 처음 출판되었으며 이후 역대 최고의 프로그래밍 책으로 선정되었습니다. 저자 Andy Hunt와 David Thomas는 Agile Manifesto의 원저자 중 하나였으며 몇 가지 심각한 자격을 가지고 있습니다.

대규모 GraphQL 쿼리 공격으로부터 보호

공격자가 공개적으로 사용 가능한 GraphQL 인터페이스를 사용하여 사이트를 스크랩하거나 서비스 거부 공격을 실행하는 방법에 대해 알아보십시오. 이들은 4 가지 방법 중 하나로이를 수행 할 수 있습니다. 단일 대형 쿼리를 신중하게 구성하여 실행하고, 관련 데이터를 가져올 수있는 병렬 쿼리를 많이 작성하고, 일괄 요청을 사용하여 많은 쿼리를 연속적으로 실행하고, 마지막으로 많은 요청을 보냅니다.

기술 인터뷰의 사회적 구성 요소

코딩 문제는 스트레스가 많지만 스트레스에 대한 당신의 반응은 당신의 기술적 능력보다 더 크게 말합니다.

기술 인터뷰의 사회적 구성 요소

기술 업계의 직책을 위해 인터뷰 할 때 일반적으로 제안을 고려하기 전에 최소한 3 차례의 인터뷰를 거치게됩니다. 라운드는 일반적으로 다음과 같습니다. 그렇게 생각하면 잘못된 것입니다.

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자를 만드는 비 기술적 인 것들 나는이 기사를 작성하는 것을 한동안 미루고 있습니다. 나는 그것을 작성할 자격이 있다고 생각하지 못했습니다. 오늘은 쓸 때라고 생각했습니다.