Lego Technic Large Hub'a Linux ile bağlanmak
Tags: lego, linux, hub, technic
Published: 2022-12-25 11:59:04

# Giriş

Öncelikle Lego'nun Technic serisinde yeni nesil (2020) **Technic Large Hub**'ından bahsetmek gerekirse motorları yöneten diğer temel hub'lardan tamamen farklı olan ve 2013'te yayınlanan Mindstorm EV3 akıllı brick'e göre daha basit ama daha hızlı bir çözüm sunmakta.

# Teknik

Özet geçmek gerekirse EV3 daha güçlü işlemci (ARM926EJ-S (VGT6) @ 300mhz vs STM32F413 @ 100mhz), daha fazla RAM (64 MB yerine 320 KB) ve Linux sistem barındırmasına rağmen daha hafif kaynaklarla, üzerinde Python da çalıştırabilen yeni nesil Hub daha pratik kullanıma sahip gözüküyor.

İlgili cihaz 2022 itibariyle; Education SPIKE Prime (sarı renk - 45601-1) ve Mindstorm Robot Inventory (turkuaz renk - 88016-1) setlerinden çıkmaktadır. Kendi içerisinde bir şarj edilebilir bataryayı da içermektedir. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qxotnyd7du762am1og63.png)

6 adet LPF2 (LEGO Power Functions 2.0) bağlantı girişini desteklemekte olup, 115KBps hıza sahiptir. Ayrıca kendi üzerinde 5x5'lik LED Matrixini içermekte olup, ayrı ayrı 3 eksenli ivmeölçer ve gyroskop içermektedir. Kullanımlara atanabilecek 3 buton bulunmakta olup, 12 bit 16KHz mono ses çıkartabilen bir hopörlör'e sahiptir. Dolayısıyla oldukça detaylı bir donanım kaynağı bulunduğu söylenebilir.

Cihaza bilgisayardan USB (TipA'dan TipB'ye) veya Bluetooth (BTC 4.2 ve BLE 4.2) ile bağlanılabilmektedir. Cihaza girdiğinizde ise karşınıza MicroPython kabuğunu içeren bir işletim sistemi çıkmaktadır. Daha sonrasında isterseniz Pybrick gibi sistemlerle farklı Firmware atıp, tekrar geri dönebilirsiniz.

# Linux ile bağlantı sağlamak

Linux sistem üzerinden iki şekilde bağlantı kurabilirsiniz. İlki USB kablo ile, diğeri Bluetooth üzerinden. Öncelikle bağlantı altyapılarını anlatacağım.

## USB ile bağlantı kurma

USB ile bağlantı kurmak istiyorsanız veri aktarımı yapabilmek için USB kablo oldukça önemli. USB tip A ve USB tip mini B bir kablo ile bağlanabilmektedir. Ama işletim sistemine erişim için kesinlikle kaliteli bir kablo kullanmanız gerekiyor. Yoksa Linux sistem USB olarak bile görmüyor (udev'e unknown olarak bile düşmüyor) fakat sadece güç verebiliyor. Evdeki 4 kablodan sadece 1 tanesi bu iş için faydalı oldu.

USB kablosunu takmadan önce aşağıdaki komut ile sisteme takılan USB'lerin bulunması için interaktif modda açılması sağlanır. Bunu yaparken yetkili bir kullanıcı ile yapmanız gerekir.

```bash
sudo dmesg -w
```

Bu komut sonrasında sisteme eklenecek cihazlar akar modda gösterim sağlar. Benim sistemimde USB cihazı takıldığında aşağıdaki gibi bir akış gerçekleşti.

```
[ 1643.090189] usb 1-7: new full-speed USB device number 5 using xhci_hcd

[ 1643.241186] usb 1-7: New USB device found, idVendor=0694, idProduct=0010, bcdDevice= 2.00

[ 1643.241202] usb 1-7: New USB device strings: Mfr=1, Product=2, SerialNumber=3

[ 1643.241209] usb 1-7: Product: LEGO Technic Large Hub in FS Mode

[ 1643.241214] usb 1-7: Manufacturer: LEGO System A/S

[ 1643.241219] usb 1-7: SerialNumber: XXXXXXXX

[ 1643.290504] cdc_acm 1-7:1.0: ttyACM0: USB ACM device

[ 1643.290528] usbcore: registered new interface driver cdc_acm

[ 1643.290529] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
```

Bu çıktıda yazan "**ttyACM0**" yazısı oldukça önemlidir. Çünkü birazdan erişim sağlarken /dev/ttyACM0 altından erişim sağlayacağımızı göstermektedir.

Bu adımdan sonra artık lsusb komutunun çıktısında da aşağıdaki gibi LEGO modunun eklendiğini görebilirsiniz.

```bash
lsusb
```

```
Bus 001 Device 005: ID 0694:0010 Lego Group LEGO Technic Large Hub in FS Mode
```

Burada yazan FS mode, dosya sistemi modu yani sisteme erişilebilirliği sağladığını göstermekte. Farklı bir şekilde firmware güncelleme yapmak istersek (ileride başka bir yazıda içerebilir) DFU mode (Device Firmware Update) şeklinde de açılabilmektedir.

Bu şekilde sistemimizi hazır hale getirdikten sonra screen ismindeki bir uygulama kullanılarak ayrı bir oturumda açabilmekteyiz. 

Screen uygulamasını kurmak için aşağıdaki komutu kullanabiliriz.

```bash
sudo apt install screen
```

Screen uygulaması kurulu ise yukarıda Linux'un tanımladığı USB cihaz adresini girerek sisteme giriş yapabilirsiniz.

```bash
sudo screen /dev/ttyACM0 115200
```

Bu şekilde microPython kabuğuna giriş yapabiliyorsunuz. Özellikle jiroskop özelliklerinden dolayı sisteme çok fazla log geliyor ise CTRL + C diyerek logları durdurabilirsiniz ve MicroPython kabuğuna düşebilirsiniz.

Screen uygulamasından çıkmak için ise CTRL + A ve sonrasında D komutunu girmek gerekiyor.

## Bluetooth ile bağlantı kurma

Large Hub'ın en önemli özelliklerinden birisi olan kablosuz çalışabilmeyi kullanabilmek için USB olmadan Bluetooth üzerinden giriş yapabilmek oldukça önemlidir. 

Dolayısıyla sistem açıkken Bluetooth düğmesine basıldığında Bluetooth'un açıldığını görebiliriz. Bluetooth açıldı ise daha önceki bir yazımda daha detaylı şekilde yazan şekilde `hcitool lescan` komutu ile cihazınızın bluetooth MAC adresini alıp not etmeniz gerekiyor.

[Bluetooth LE cihazlarla Çalışma](https://dev.to/aliorhun/bluetooth-le-cihazlarla-calisma-3jb1)

Bu adımdan sonra Linux sistemine, Bluetooth üzerindeki dosya sistemini bağlamak için aşağıdaki komut kullanılabilir:

```
sudo rfcomm connect /dev/rfcomm0 33:08:F2:YY:5C:XX
```

Bu komut ilgili cihazı "/dev/rfcomm0" adresine bağlamaya yaramaktadır.

Bağlantıyı kapatmak için ise aşağıdaki komut uygulanacak ama işiniz bitmeden bağlantıyı kapatmamak gerekir.

```
sudo rfcomm release /dev/rfcomm0 33:08:F2:YY:5C:XX
```

Screen uygulaması kurulu ise yukarıda Linux'un tanımladığımız girerek sisteme giriş yapabilirsiniz.

```bash
sudo screen /dev/rfcomm0 
```

Bu şekilde microPython kabuğuna giriş yapabiliyorsunuz. Özellikle jiroskop özelliklerinden dolayı sisteme çok fazla log geliyor ise CTRL + C diyerek logları durdurabilirsiniz ve MicroPython kabuğuna düşebilirsiniz.

Screen uygulamasından çıkmak için ise CTRL + A ve sonrasında D komutunu girmek gerekiyor.

## Giriş yaptıktan sonra ilk adımlar

USB ve Bluetooth bağlantısını paralel olarak rahatlıkla kullanabilirsiniz. Micropython arayüzü üzerinde öncelikle sistemdeki uygulamaları kullanabileceğiniz **hub** modülünü import etmeniz gerekecektir.

https://lego.github.io/MINDSTORMS-Robot-Inventor-hub-API/

Bu adımdan sonrası ise hub modülü kullanılarak Python kabuk üzerinde bir şeyler geliştirebilirsiniz. Basit şekilde aşağıdaki gibi iki komut peş peşe kullanabilirsiniz.

```python
import hub
hub.display.show('Merhaba Dunya')
```

Bu şekilde hub üzerinde harfleri görebilirsiniz.

## Uzaktan uygulama geliştirmek

Uzaktan uygulama geliştirmek için Python'un pyserial kütüphanesi kullanılabilmektedir. USB veya Bluetooth için yukarıdaki adresleri kullanmak önemli olacaktır.

```python
import serial
import time
# Bluetooth:
connection = serial.Serial('/dev/rfcomm0', timeout=2)

connection.baudrate = 9600  # set Baud rate to 9600
connection.bytesize = 8     # Number of data bits = 8
connection.parity   ='N'    # No parity
connection.stopbits = 1     # Number of Stop bits = 1

time.sleep(1) 

connection.flush()
connection.write(b'\x03') #CTRL + C için
connection.write(b'import hub\r')
print('I have imported the hub module for you')
while True:
    connection.write(b'hub.display.show("Merhaba Dunya")\r')
    connection.write(b'hub.display.clear()\r')
```