В прошлый раз мы рассчитали электрическую цепь и проверили её на макетной плате. У меня оказался такой светодиод, что нам нужно обеспечить 4mA на каком-либо GPIO. Теперь дело за программным обеспечением.
Я должен сказать, что собираюсь зажечь светодиод из Kotlin
Я указываю USE flags
просто для справки, в большинстве случаев они и так уже такие. Собираем Intellij для Raspberry Pi на машине с Linux, где уже установлена Intellij.
dev-java/icedtea
(USE=”alsa cups gtk jbootstrap pch source sunec webstart”) и на Linux машину и на Raspberry Pi. git clone https://github.com/JetBrains/intellij-community.git
git checkout -b yr
1
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 и распаковываем там в какой-нибудь каталог.git clone https://github.com/joan2937/pigpio.git
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
https://github.com/nkolban/jpigpio.git
JPigpio/Makefile
и JPigpioC/Makefile
заменяя LIBDIR
на что-то вроде /home/user-name/local/lib
2
./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/
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
Схема:
Реальность:
Запускаем получившийся JAR:
Ну не круто ли? Я счастлив