Festlegen des GPIO-Werts beim Booten

7

Ich bin ein Semi-Linux-Neuling und habe eine Frage:

Ich muss einige GPIO-Pins auf diese Weise setzen: (Pin 18 out, Pin 17 in) (eigentlich mache ich das über WiringPi (pyton) über diese Befehle)

gpio export 18 out

gpio export 17 in

Alles funktioniert gut, wenn ich diese Befehle über das Terminal ausführe. Allerdings habe ich diese Befehle in gesetzt

/etc/rc.local

Vor exit 0

um es beim Booten auszuführen, aber nach einigen Versuchen wird es nicht funktionieren. Es könnte ein Pfadproblem sein? Jede Hilfe wird geschätzt, danke mboy.

Malgaboy
quelle
Pfadsache - ja, besser, wenn Sie den vollständigen Pfad verwenden. Was passiert, wenn Sie /etc/rc.local ausführen? Erhalten Sie eine Ausgabe? Ist das Skript ausführbar?
Abolotnov
Ok, aber ich würde nicht wissen, wie man den vollständigen Pfad einstellt. Es ist das erste Mal, dass ich rc.local und wiringpi verwende.
malgaboy

Antworten:

7

Ich habe es behoben! Alles was ich brauchte ist, den vollen Pfad festzulegen. In meinem Fall, /usr/local/bin/gpio export 18 out weil gpio ein Befehl eines Drittanbieters ist.

Malgaboy
quelle
2

Eine weitere gute Idee ist es, ein eigenes Skript zu erstellen, wie:

#! /bin/bash gpio mode 18 out gpio mode 17 in exit 0

Speichern Sie es in einer Datei, z gpio_init.sh

Führen Sie es aus chmod a+x simple_bash.sh , um es ausführbar zu machen

Kopieren nach init.dmit:sudo cp /path_to_script/script.sh /etc/init.d/

Zur Startsequenz hinzufügen: sudo update-rc.d script.sh defaults

Andrey Volkov
quelle
0

Als Ergänzung zu Andrey Volkovs Antwort hat das neue Debian-System ein festgelegtes Format für das Init-Skript. Bitte beziehen Sie sich hier

Damit habe ich ein Skript erstellt, das auf Ihrem System funktionieren soll.

Nennen Sie das folgende Skript gpio_init und chown to root.root und chmod to 755. Kopieren Sie es nach /etc/init.d/

#!/bin/sh
### BEGIN INIT INFO
# Provides:          gpio_init
# Required-Start:    $local_fs $network $named $time $syslog
# Required-Stop:     $local_fs $network $named $time $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Description:       Initialize GPIO pins for the project
### END INIT INFO

SCRIPT=/usr/local/bin/gpio-init
RUNAS=root

PIDFILE=/var/run/gpio_init.pid
LOGFILE=/var/log/gpio_init.log

start() {
  if [ -f /var/run/$PIDNAME ] && kill -0 $(cat /var/run/$PIDNAME); then
    echo 'Service already running' >&2
    return 1
  fi
  echo 'Starting service…' >&2
  local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!"
  su -c "$CMD" $RUNAS > "$PIDFILE"
  echo 'Service started' >&2
}

stop() {
  if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then
    echo 'Service not running' >&2
    return 1
  fi
  echo 'Stopping service…' >&2
  kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE"
  echo 'Service stopped' >&2
}

uninstall() {
  echo -n "Are you really sure you want to uninstall this service? That cannot be undone. [yes|No] "
  local SURE
  read SURE
  if [ "$SURE" = "yes" ]; then
    stop
    rm -f "$PIDFILE"
    echo "Notice: log file is not be removed: '$LOGFILE'" >&2
    update-rc.d -f gpio_init remove
    rm -fv "$0"
  fi
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  uninstall)
    uninstall
    ;;
  retart)
    stop
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|uninstall}"
esac

Dieses Skript ruft ein anderes Skript unter / usr / local / bin / auf.

gpio-init (Entschuldigung für die Benennung hier ...

#! /bin/bash

function cleanup {
    echo 5 > /sys/class/gpio/unexport
    echo 6 > /sys/class/gpio/unexport
    exit 0
}

# Clean up when exit
trap cleanup EXIT
trap cleanup SIGHUP
trap cleanup SIGQUIT
trap cleanup SIGINT
trap cleanup SIGTERM

echo 5 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio5/direction
echo 1 > /sys/class/gpio/gpio5/value
sleep 0.000030  # 30us
echo 0 > /sys/class/gpio/gpio5/value
sleep 0.000030  # 30us
echo 1 > /sys/class/gpio/gpio5/value
sleep 0.001

echo 6 > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio6/direction
echo "rising" > /sys/class/gpio/gpio6/edge

sleep infinity

exit 0

Ein paar Dinge hier. Zuerst verwende ich echo GPIO_PIN> / sys / class / gpio / export zum Exportieren des Pins, ähnlich zum Einrichten der IN / OUT 1/0 INTERRUPT-Flanke. Sie können es nach Ihren Wünschen anpassen.

Ich sleep infinitylasse es für immer laufen

Ich nehme alle Interrupt-Signale auf und führe eine Bereinigungsfunktion durch, bei der ich die GPIO-PINS nicht exportiert habe.

Wiederum wurde dieses Skript (aus Sicherheitsgründen) nur für root beschreibbar und unter / usr / loca / bin abgelegt

Test mit sudo /etc/init.d/gpio_init start undsudo /etc/init.d/gpio_init stop

Und sobald Sie fertig sind sudo update-rc.d gpio-init defaults, können Sie das Skript beim Start ausführen

Junting Zhao
quelle
2
Könnte für jeden funktionieren, der ein veraltetes SysV-Betriebssystem ausführt, aber kaum relevant.
Milliways