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

548 слов | 2018-3-17

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

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

Kotlin

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

  • Устанавливаем dev-java/icedtea (USE=”alsa cups gtk jbootstrap pch source sunec webstart”) и на Linux машину и на Raspberry Pi.
  • Скачиваем Intellij Community edition
 git clone https://github.com/JetBrains/intellij-community.git

  • Заводим свою ветку git checkout -b yr 1
  • Идём на официальный сайт и следуем инструкции. Указываем IcedTea для JDK.
  • Запускаем компиляцию из командной строки, если требует JavaFX, то копируем её из существующей Intellij.
 ant  -Dintellij.build.skip.build.steps=mac_artifacts,mac_dmg,mac_sign,windows_exe_installer

  • Готовый out/idea-ce/artefacts/ideaC-182.SNAPSHOT.tar.gz копируем на Raspberry Pi и распаковываем там в какой-нибудь каталог.

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

Pigpio

  • Забираем исходники git clone https://github.com/joan2937/pigpio.git
  • Накладываем patch для обнаружения Raspberry Pi в режиме 64 бита:

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))

  • make
  • sudo make install
  • Проверяем успешность sudo ./x_pigpio Снимок экрана с результатами проверки pigpio

Jpigpio

  • Забираем исходники https://github.com/nkolban/jpigpio.git
  • Правим файлы JPigpio/Makefile и JPigpioC/Makefile заменяя LIBDIR на что-то вроде /home/user-name/local/lib2
  • Собираем и устанавливаем ./build.sh

Изменение 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. Каталог должен существовать. 

Дата изменения: