Yellow Rabbit

Вариант настройки программного обеспечения

Kotlin и GPIO в Raspberry Pi

В прошлый раз мы рассчитали электрическую цепь и проверили её на макетной плате. У меня оказался такой светодиод, что нам нужно обеспечить 4mA на каком-либо GPIO. Теперь дело за программным обеспечением.

Я должен сказать, что собираюсь зажечь светодиод из Kotlin:smiley:

Kotlin

Я указываю USE flags просто для справки, в большинстве случаев они и так уже такие. Собираем Intellij для Raspberry Pi на машине с Linux, где уже установлена Intellij.

 git clone https://github.com/JetBrains/intellij-community.git

 ant  -Dintellij.build.skip.build.steps=mac_artifacts,mac_dmg,mac_sign,windows_exe_installer

Снимок экрана с Intellij на Raspberry Pi

Pigpio


diff --git a/pigpio.c b/pigpio.c
index 710d20f..7e38063 100644
--- a/pigpio.c
+++ b/pigpio.c
@@ -13296,6 +13296,13 @@ unsigned gpioHardwareRevision(void)
                   pi_mem_flag  = 0x04;
                }
             }
+           // arm64 /proc/cpuinfo does not contain "model name"
+           if (!strncasecmp("CPU architecture: 8", buf, 19)) {
+                  piCores = 4;
+                  pi_peri_phys = 0x3F000000;
+                  pi_dram_bus  = 0xC0000000;
+                  pi_mem_flag  = 0x04;
+           }
          }
 
          if (!strncasecmp("revision\t:", buf, 10))

Jpigpio

Изменение java.library.path на лету

Для того чтобы использовать Jpigpio, а точнее libJPigpioC.so я использую быстрый и грязный хак от инженеров Sun:


package io.github.yrabbit.java.util;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;

public class AddDir {
    public static void addDir(String s) throws IOException {
        try {
            // This enables the java.library.path to be modified at runtime
            // From a Sun engineer at http://forums.sun.com/thread.jspa?threadID=707176
            //
            Field field = ClassLoader.class.getDeclaredField("usr_paths");
            field.setAccessible(true);
            String[] paths = (String[])field.get(null);
            for (int i = 0; i < paths.length; i++) {
                if (s.equals(paths[i])) {
                    return;
                }
            }
            String[] tmp = new String[paths.length+1];
            System.arraycopy(paths,0,tmp,0,paths.length);
            tmp[paths.length] = s;
            field.set(null,tmp);
            System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + s);
        } catch (IllegalAccessException e) {
            throw new IOException("Failed to get permissions to set library path");
        } catch (NoSuchFieldException e) {
            throw new IOException("Failed to get field handle to set library path");
        }
    }
}

Проект

Собственно создание проекта в Intellij довольно прямолинейно. Не думаю, возникнут какие-то затруднения, но на всякий случай я сделал несколько снимков с экрана. Что я мог там забыть? Пару команд в консоли:


mkdir -p src/main/kotlin src/main/java libs
ln -s ~/local/lib/Pigpio.jar libs/

Первая программа для Raspberry Pi


package io.github.yrabbit.kotlin.led

import io.github.yrabbit.java.util.AddDir
import jpigpio.JPigpio.*
import jpigpio.Pigpio
import jpigpio.PigpioException
import jpigpio.Utils

fun main(args: Array<String>) {
    // dirty hack: need to point java.library.path to the location of libJPigpioC.so
    AddDir.addDir("/usr/local/lib")

    println("Kotlin Raspberry Pi gentoo64")
    println("You must see a blinking universe :)")
    try {
        // Init lib
        val pigpio = Pigpio()
        pigpio.gpioInitialize()
        Utils.addShutdown(pigpio)

        // Mode output
        pigpio.gpioSetMode(LED_PIN, PI_OUTPUT)

        repeat(3) {
            // ON
            pigpio.gpioWrite(LED_PIN, PI_HIGH)
            pigpio.gpioDelay(500 * 1000)
            // OFF
            pigpio.gpioWrite(LED_PIN, PI_LOW)
            pigpio.gpioDelay(500 * 1000)
        }
    } catch(e: PigpioException) {
        e.printStackTrace()
    }
    pigpio.gpioSetMode(LED_PIN, PI_INPUT)
}

const val LED_PIN = 26 // GPIO26

Подключаем к Raspberry Pi

Схема: Набросок макетной платы

Реальность: Реальное соединение Raspberry Pi и макетной платы

Пуск

Запускаем получившийся JAR: Запуск

Ну не круто ли? Я счастлив:smile:

  1. Это нужно чтобы добавить быструю индексацию файлов в Idea. Об этом после. 

  2. Каталог должен существовать.