Один синий светодиод горел просто восхитительно. У меня завалялись ещё несколько светодиодов разных цветов. Сделаем-ка что-то вроде минигирлянды!
Посмотрим, что у меня есть: Три 5mm светодиода: красный, жёлтый и зелёный. Используя табличку для падений напряжения на светодиодах различных цветов рассчитаем падения напряжения на ограничивающих резисторах:
Цвет | V на светодиоде | V на резисторе |
---|---|---|
Красный | ||
Жёлтый | ||
Зелёный |
Опять исходим из допустимого тока через нагрузочные резисторы равного 8mA:
Округляем в большую сторону (чтобы уменьшить ток через резистор, а не увеличить его) и получаем для всех трёх резисторов .
Общий ток , это ниже допустимых 50mA, к тому же мы, как обычно, сначала проверим схему на небольшом блоке питания.
Светодиоды: D1
- синий, D2
- зелёный, D3
- жёлтый, D4
- красный.
Резисторы: R1
- , R2
, R3
, R4
- .
Соответствие GPIO цветам:
GPIO | Цвет |
---|---|
26 | Синий |
22 | Зелёный |
27 | Жёлтый |
17 | Красный |
Рассчитаем токи через резисторы:
То есть преположение о 8mA оказалось верным и мы можем без опаски присоединять схему к Raspberry Pi
Сделаем несколько простых эффектов:
package io.github.yrabbit.kotlin.led
import io.github.yrabbit.java.util.AddDir
import jpigpio.JPigpio
import jpigpio.JPigpio.*
import jpigpio.Pigpio
import jpigpio.Utils
fun main(args: Array<String>) {
// dirty hack: need to point java.library.path to the location of libJPigpioC.so
AddDir.addDir("/home/rabbit/local/lib")
println("Kotlin Raspberry Pi gentoo64")
println("You must see a lights :)")
// Init lib
val pigpio = Pigpio()
pigpio.gpioInitialize()
Utils.addShutdown(pigpio)
// Check drive strength on GPIO
val strength = pigpio.gpioGetPad(0)
println("Current drive strength:${strength}mA")
if (strength != CURRENT) {
pigpio.gpioSetPad(0, CURRENT)
val newStrength = pigpio.gpioGetPad(0)
println("New drive strength:${newStrength}mA")
}
// Mode output
for (led in LEDS) {
pigpio.gpioSetMode(led.pin, PI_OUTPUT)
}
// forward and backward
val mode0 = arrayOf(0, 1, 2, 3, 2, 1)
//
val mode1 = arrayOf(0, 3, 1, 2, 1, 2)
val mode2 = arrayOf(0, 1, 2, 3)
repeat(3) {
chainBlink(pigpio, mode0)
}
repeat(3) {
chainBlink(pigpio, mode1)
}
repeat(3) {
chainBlink(pigpio, mode2)
}
//
gpioSwitchToInput(pigpio)
}
fun chainBlink(pigpio: JPigpio, chain: Array<Int>) {
for (led in chain) {
// ON
pigpio.gpioWrite(LEDS[led].pin, PI_HIGH)
pigpio.gpioDelay(300 * 1000)
// OFF
pigpio.gpioWrite(LEDS[led].pin, PI_LOW)
pigpio.gpioDelay(100 * 1000)
}
}
/*
* Clean up
*/
fun gpioSwitchToInput(pigpio: JPigpio) {
UsedGPIO.values().forEach {
pigpio.gpioSetMode(it.pin, PI_INPUT)
}
}
enum class UsedGPIO(val pin: Int) {
BlueLedPin(26), // GPIO26
GreenLedPin(22), // GPIO22
YellowLedPin(27), // GPIO27
RedLedPin(17) // GPIO17
}
val LEDS = arrayOf(UsedGPIO.BlueLedPin, UsedGPIO.GreenLedPin, UsedGPIO.YellowLedPin, UsedGPIO.RedLedPin)
const val CURRENT = 8 // 8mA
Запускаем получившийся JAR:
Ну не круто ли? Я счастлив