Yellow Rabbit

Используем больше светодиодов

Больше света!

Один синий светодиод горел просто восхитительно. У меня завалялись ещё несколько светодиодов разных цветов. Сделаем-ка что-то вроде минигирлянды!

Посмотрим, что у меня есть: Имеющиеся у меня светодиоды Три 5mm светодиода: красный, жёлтый и зелёный. Используя табличку для падений напряжения на светодиодах различных цветов рассчитаем падения напряжения на ограничивающих резисторах:

Цвет V на светодиоде V на резисторе
Красный
Жёлтый
Зелёный

Опять исходим из допустимого тока через нагрузочные резисторы равного 8mA:

Округляем в большую сторону (чтобы уменьшить ток через резистор, а не увеличить его) и получаем для всех трёх резисторов .

Общий ток , это ниже допустимых 50mA, к тому же мы, как обычно, сначала проверим схему на небольшом блоке питания.

Принципиальная схема

Светодиоды: D1 - синий, D2 - зелёный, D3 - жёлтый, D4 - красный. Резисторы: R1 - , R2, R3, R4 - . Принципиальная электрическая схема Соответствие GPIO цветам:

GPIO Цвет
26 Синий
22 Зелёный
27 Жёлтый
17 Красный

Макетная плата

Макетная плата

Проверка на плате

Рабочая плата Напряжение на красном светодиоде Напряжение на жёлтом светодиоде Напряжение на зеленом светодиоде

Рассчитаем токи через резисторы:

То есть преположение о 8mA оказалось верным и мы можем без опаски присоединять схему к Raspberry Pi:smiley:

Программа

Сделаем несколько простых эффектов:


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:

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