Terimler, terimler

Go -Golang- Google tarafından geliştirilen, açık kaynak kodlu, statik tiplemeli ve kepkeyifli bir programlama dili. detaylı

Arduino, geliştirme dili C++ olan, programlanması oldukça kolay, hobi/eğitim amaçlı kullanılan işletim sistemi koşturmayan I/O geliştirme kartı. detaylı

Nasıl oluyor peki

Arduino programlamak için önümüzde iki seçenek var:

  • 1- Programı doğrudan Arduino üzerine yazıp koşturmak.
  • 2- Programı bir işletim sisteminde çalıştırıp (bilgisayar), Arduino üzerinde çalışan başka bir yazılım aracılığı ile iletişime geçirmek.

1- Programı doğrudan Arduino üzerine yazıp koşturma

Doğrudan Arduino mikroçipi içerisinde çalışacak olan yazılım.

Artıları

  • İzole çalışma
  • Host bilgisayar gerektirmemesi

Eksileri

  • Düşük kod yazma kalitesi
  • fmt dahil bazı kütüphane ve fonksiyonların kullanılamaması

Bu seçenek projenizi kurtarıyorsa sizi Tinygo ile tanıştırayım. Bu canavar Go söz dizimi kullanan LLVM bazlı “Küçük yerler için Go” prensibini sağlayan bir derleyici. Go dili ile hazırladığımız kodu tinygo ile derledikten sonra, yine tinygo aracılığı ile kartımıza flashlayabiliyoruz.

Tinygo

tinygo Tinygo yalnızca bir framework değildir. Tinygo, Go söz dizimini ve paketlerini kullanabilen Go derleycisidir.

Kurulum

Website

To install TinyGo, select the link for your operating system:

You can use Docker if that’s easier on your system or you would rather try 
TinyGo in a sandbox but note that it is not as convenient to use as installing 
TinyGo directly.

Ortam

Tinygo gerçekten var olmayan (Go programlama dilinin kullanamayacağı) bazı paketleri kullanır. Bu sebepten Tinygo ile programlama yaparken Tinygo’nun bize sağlayacağı GOROOT ve GOFLAG environmentlarını kullanmak zorundayız.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$raif> tinygo info arduino

LLVM triple:       avr
GOOS:              linux
GOARCH:            arm
GOARM:             6
build tags:        avr baremetal linux arm atmega328p atmega avr5 arduino tinygo math_big_pure_go gc.conservative scheduler.none serial.uart
garbage collector: conservative
scheduler:         none
cached GOROOT:     /home/raif/.cache/tinygo/goroot-f72f1dd9a297f6751904bf8b1e6c8e86221f6da54aa23a0cb2373098acf469a1

Programın döndürüğü cached GOROOT çıktısını takip ederseniz Go tarafından kullanılabilir GOROOT dosyasının oluştuğunu göreceksiniz.

VS Code

Buradaki eklenti aracılığı ile .vscode/settings.json‘u değiştirerek code ide’de tinygo’yu kullanabilirsiniz.

tinygo-code

Vim

Bağlantıyı takip ederek kurulumu yapabilirsiniz.

Go

Aşağıdaki kod satırları Arduino Uno’nun gömülü ledini 1 saniye aralık ile aç kapat yapıyor.

 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
package main

import (
	"machine"
	"time"
)

const (
	builtinled machine.Pin = 5
)

func init() {
	builtinled.Configure(machine.PinConfig{
		Mode: machine.PinOutput,
	})
	builtinled.High()
	time.Sleep(time.Second)
	builtinled.Low()
}

func main() {
	for {
		if builtinled.Get() {

			machine.Serial.Write([]byte("Led DOWN\n"))
			builtinled.Low()
		} else {
			machine.Serial.Write([]byte("Led UP\n"))
			builtinled.High()
		}
		time.Sleep(time.Second)
	}
}

Çalıştırma

1
tinygo flash -target=arduino -port /dev/ttyUSB0 .

/dev/ttyUSB0 yerine Arduino’yu bağladığınız usb portunu yazmayı unutmayın. Not: GNU Linux kullanıcıları usb portunun klasörürüne kendi user ownerlığını vererek super user olmadan tinygo flash’ı kullanabilir.

tf

2- Programı bilgisayarda çalıştırıp Arduino ile iletişime geçirme

Arduino com portu ile bilgisayara bağlanır, com portu ile komut gönderilip komut alınır.

Artıları

  • Kolay geliştirme ortamı
  • Tam fonksiyonel Go kodlama imkanı
  • Native kütüphaneler ile kullanılabilme

Eksileri

  • Firmata aracı yazılım
  • Com portu bağlı olmak zorunda
  • Arduino sunucu bilgisayara bağlı çalışmak zorunda

Bu koşullar size uygunsa, sizi bir başka canavar ile tanıştırayım: GOBOT

Gobot

gobot “Gobot is a framework for robots, drones, and the Internet of Things (IoT), written in the Go programming language. Supports 35 different platforms.”

Kurulum

go get -d -v -x -u gobot.io/x/gobot/... Ayrıca Arduino kartımıza Firmata yazılımını yüklemek zorundayız. Gobot bu yazılım ile iletişime geçecek.

1
2
go get -v github.com/hybridgroup/gort
go install github.com/hybridgroup/gort

En sonunda terminale ‘gort’ yazdığımız zaman şu çıktıyı alıyor olmamız gerekiyor.

 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
NAME:
   gort - Command Line Utility for RobotOps

USAGE:
   gort [global options] command [command options] [arguments...]

VERSION:
   0.9.0

COMMANDS:
     scan       Scan for connected devices on Serial, USB, or Bluetooth ports
     bluetooth  Connect & disconnect bluetooth devices.
     arduino    Install avrdude, and upload HEX files to your Arduino
     raspi      Download and install components for your Raspberry Pi
     chip       Download and install device tree components for your C.H.I.P
     particle   Upload sketches to your Particle Photon or Electron
     digispark  Configure your Digispark microcontroller
     microbit   Install and upload firmware to your BBC Microbit
     crazyflie  Configure your Crazyflie
     klaatu     barada nikto
     help, h    Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h     show help
   --version, -v  print the version

Not: gort $GOPATH/bin klasörü altına yüklenecektir. Klasörü PATH’e eklemeyi unutmayın.

Arduino kartımızı bilgisayara bağladıktan sonra

1
gort arduino upload firmata /dev/ttyUSB0

komutu ile firmata yazılımını Arduino kartınıza flashlayabilirsiniz.

Not: /dev/ttyUSB0 işletim sistemine - bağlı usb cihazlarına göre farklılık gösterebilir.

Not: gort ile Arduino karta firmata yazılımını yüklemek bir kerelik bir işlemdir.

Go

package main

import (
	"log"
	"time"

	"gobot.io/x/gobot"
	"gobot.io/x/gobot/drivers/gpio"
	"gobot.io/x/gobot/platforms/firmata"
)

func main() {
	adaptor := firmata.NewAdaptor("/dev/ttyUSB0")
	led := gpio.NewLedDriver(adaptor, "13")
	bot := gobot.NewRobot(adaptor, "codot",
		[]gobot.Connection{adaptor},
		[]gobot.Commander{led},
		func() {

			log.Println("Running!")

			for range time.NewTicker(time.Second).C {
				led.Toggle()
			}
		})
	if err := bot.Start(); err != nil {
		log.Fatalln(err)
	}
}

Bilgisayar ile birlikte çalışacak otomasyonlar için çok uygun bir yapıya sahip Gobot. Ancak bilgisayar ile Arduino arasındaki bağ kopacak olursa Arduino ile iletişim kopacağı için henüz çalışmayan satırlar asla çalışmayacaktır.

Çalıştırma & Derleme

Gobot, gerçekten de Go olduğu için, her gün yazdığınız komutları kullanarak çalıştırabilir ikili dosya üretebilirsiniz.

1
2
3
4
5
6
7
8
$raif> go run .
2022/06/06 13:46:18 Initializing connections...
2022/06/06 13:46:18 Initializing connection Firmata-16C1C540DC28CE6B ...
2022/06/06 13:46:18 Robot codot initialized.
2022/06/06 13:46:18 Starting Robot codot ...
2022/06/06 13:46:18 Starting connections...
2022/06/06 13:46:18 Starting connection Firmata-16C1C540DC28CE6B on port /dev/ttyUSB0...
...