# Go — Raspberry Pi GPIO "Привет мир" руководство

Для относительно нового языка, к которым относится  Go.  Я использовать его с тех годов, по нескольким причинам, так как он полон сюрпризов.

Поэтому недавно, я купил новую  pi3 и в основном использовал C  для прошлой pi2. Однако, отметим, множество руководств использует питон, а я не большой фанат этого языка. Поэтому я случайным образом поискал библиотеке  Go и различные руководства для Pi GPIO,  и поигрался чуток с проводульками у меня дома.

В этой статье мы собираемся построить очень простую  LED переключалку используя  Raspberry Pi  и язык  Golang.

Мы можем установить целое Go окружение внутри  Raspberry Pi, однако, это займет много ресурсов внутри маленькой машинки. Поэтому, я предпочитаю разрабатывать и строить программу удаленно с моего рабочего места.

# 1. Используем GPIO
Мы собираемся создать очень простую мерцающую программу, которую усстановим и запустим на  Raspberry PI. Поэтому. перед этим, нужно понять базу, как работать с  GPIO.

Самый простой способ считать  GPIO интерфейсом, который лежит между системой Pi и внешней системой. IO модуль будет использовать GPIO пины, таким образом, чтобы raspberry могла читать ввод или показывать вывод от девайса или сенсора.

[![FIg 2. Raspberry Pi 2 GPIO Map](https://notepad.gasick.ru/uploads/images/gallery/2021-10/scaled-1680-/image-1634898347231.png)](https://notepad.gasick.ru/uploads/images/gallery/2021-10/image-1634898347231.png) 

Как показано на рисунке, устройство имеет несколько типов пинов, такие как GPIO, земля, 3.3 вольтовые и 5 вольтовые пины. Для нашей инструкции мы собираемся играться с  GPIO 18 пином и землей.

Мы так же можем получить доступ к  GPIO информации через термина исопльзуются команду `pinout`.

# 2. Собираем LED устройство 
Для этой инструкции, мы собираемся подготовить несколько вещей:
1. USB кабель и зарядник для питания Raspberry PI,
2. 2 коротких переключателя проводов,
3. Макет,
4. LED, and
5. 330Ω резистор

Я не буду рассказывать глубого процесс установки, так как это легко можно найти в интернете.

[![Figure 3. Raspberry Pi 3 with LED](https://notepad.gasick.ru/uploads/images/gallery/2021-10/scaled-1680-/image-1634898380275.png)](https://notepad.gasick.ru/uploads/images/gallery/2021-10/image-1634898380275.png)
# 3. Разработка Go  кода 
Наконец, мы собираемся разработать код используя Go. Перво-наперво, мы будем использовать доступный такой пакет в интернете, как:

https://github.com/stianeikeland/go-rpio, and http://gobot.io/documentation/platforms/raspi/


Go-rpio поддерживает операции для GPIO используя Golang, поэтому я верю, что он достаточно подходит для наших целей. В то время как Gobot предоставялет целую SDK библиотеку для доступа к GPIO пинам и специфические драйвера как: LED, мотор, реле, сервопривод и т.д.

В этом случае, я собираюсь использовать Go-rpio для базового LED примера, так как мы не собираемся использовать эти дравйвера на данный момент.

Как я упоминал в самом начале, мы собираемся разрабатывать удалеенно. Поэтому сперва, скачаем пакет который будем использовать.
```bash
go get github.com/stianeikeland/go-rpio
```

Это пример кода для создания мерцающего приложения используя Go  на raspberry pi:

```go
package main

import (
	"fmt"
	"time"

	"github.com/stianeikeland/go-rpio"
)

func main() {
	fmt.Println("opening gpio")
	err := rpio.Open()
	if err != nil {
		panic(fmt.Sprint("unable to open gpio", err.Error()))
	}

	defer rpio.Close()

	pin := rpio.Pin(18)
	pin.Output()

	for x := 0; x < 20; x++ {
		pin.Toggle()
		time.Sleep(time.Second / 5)
	}
}
```
Объяснение:
Этот код открывает GPIO и устанавливает режим приема на пине 18. Пин будет настроен для вывода(Ввода для чтения, типа сенсора и т.д.). 20 переключит режим пина(Low > High > Low) и установит задержку 200ms. Как только операция выполнится, программа будет завершена. 
# 4. Сборка и загрузка программы. 
Для того, чтобы безопасно собрать программу мы будем использовать команду:
```bash
env GOOS=linux GOARCH=arm GOARM=5 go build
```
Команда выше говорит компилятору. что мы собираем программу для Linux и  ARM  архитектуру. На данный момент, есть поддержка нескольких версий ARM компилятором Go, но мы ищем версию 5. 
Затем мы собираемся загрузитьь \ скопировать файл на подключенную raspberry pi. Для этой цели, мы собираемся использовать scp команду.
```bash
scp [go binary] pi@192.168.43.208:[remote dir]
```
# 5. Запуск программы
Как только бинарник был загружен(для примера, мы загрузили его по пути /home/pi/go/gopio), то чтобы его запустить нужно выполнить команду:
```bash
./gopio
```
Если программа верно собрана, и нет ошибок в коде, LED будет мерцать и остановится после 20 переключений.

[![Figure 4. Raspberry Pi LED Blink](https://notepad.gasick.ru/uploads/images/gallery/2021-10/scaled-1680-/image-1634898394920.png)](https://notepad.gasick.ru/uploads/images/gallery/2021-10/image-1634898394920.png)
# 6. Выводы 
Можно использовать Raspberry-Pi для разработки программ внутри Raspberry-Pi. В этой статье, я показал вам простой пример, как создать мерцающий LED используя Raspberry Pi, на языке Golang.
# 7. Image Link and Resources
* [turning-on-an-led-with-your-raspberry](https://thepihut.com/blogs/raspberry-pi-tutorials/27968772-turning-on-an-led-with-your-raspberry-pis-gpio-pins)
* [cross-compiling-golang-applications-raspberry-pi](https://www.thepolyglotdeveloper.com/2017/04/cross-compiling-golang-applications-raspberry-pi/)
* [go-rpio](https://github.com/stianeikeland/go-rpio)
* [gobot](https://gobot.io/documentation/platforms/raspi/)
* [Raspberry Pi icon in Color Style](https://icons8.com/icon/13443/raspberry-pi)