Đặt giá trị GPIO khi khởi động


7

Tôi là người mới bán linux và tôi có một câu hỏi:

Tôi cần đặt một số chân GPIO theo cách này: (chân 18 ra, chân 17 in) (thực ra tôi đang thực hiện điều này thông qua WiresPi (pyton) đã nghĩ ra lệnh này)

gpio export 18 out

gpio export 17 in

Tất cả hoạt động tốt nếu tôi chạy các lệnh này thông qua thiết bị đầu cuối. Tuy nhiên tôi đã thiết lập các lệnh này trong

/etc/rc.local

trước exit 0

để chạy nó khi khởi động, nhưng sau một số lần thử, nó sẽ không hoạt động. Nó có thể là một vấn đề con đường? Bất kỳ trợ giúp được đánh giá cao, Cảm ơn mboy.


Đường dẫn điều - có, tốt hơn là sửa nó để sử dụng đường dẫn đầy đủ. Điều gì xảy ra khi bạn chạy /etc/rc.local - bạn có nhận được bất kỳ đầu ra nào không, tập lệnh có chạy được không?
abolotnov

Ok, nhưng tôi không biết làm thế nào để thiết lập đường dẫn đầy đủ .. đây là lần đầu tiên tôi sử dụng RC.local và Wiredpi ..
malgaboy

Câu trả lời:


7

Tôi đã sửa nó! Tất cả tôi cần là thiết lập đường dẫn đầy đủ. Trong trường hợp của tôi /usr/local/bin/gpio export 18 out vì gpio là lệnh của bên thứ ba.


2

Một ý tưởng hay khác là tạo kịch bản của riêng bạn như:

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

Lưu nó vào tập tin, vd gpio_init.sh

Chạy chmod a+x simple_bash.sh để làm cho nó thực thi

Sao chép vào init.d:sudo cp /path_to_script/script.sh /etc/init.d/

Thêm vào trình tự khởi động: sudo update-rc.d script.sh defaults


0

Để bổ sung cho câu trả lời của Andrey Volkov, hệ thống Debian mới có định dạng được đặt cho tập lệnh init. Vui lòng tham khảo tại đây

Với điều đó tôi đã tạo ra một kịch bản nên hoạt động trên hệ thống của bạn.

Đặt tên cho đoạn script sau gpio_init và chown vào root.root và chmod thành 755. Sao chép nó vào /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

Tập lệnh này sẽ gọi một tập lệnh khác trong / usr / local / bin /

gpio-init (xin lỗi về cách đặt tên ở đây ...

#! /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

Một vài điều ở đây. Đầu tiên tôi sử dụng echo GPIO_PIN> / sys / class / gpio / export để xuất mã pin, tương tự để thiết lập cạnh IN / OUT 1/0 INTERRUPT. Bạn có thể tùy chỉnh nó theo nhu cầu của bạn.

Tôi sử dụng sleep infinityđể cho nó chạy mãi mãi

Tôi nắm bắt bất kỳ tín hiệu ngắt nào và thực hiện chức năng dọn dẹp trong đó tôi không thể hiện được mã PIN GPIO.

Một lần nữa làm cho tập lệnh này chỉ có thể ghi vào root (vì lý do bảo mật) và đặt nó dưới / usr / loca / bin

Kiểm tra với sudo /etc/init.d/gpio_init startsudo /etc/init.d/gpio_init stop

Và một khi đã sẵn sàng sử dụng sudo update-rc.d gpio-init defaultsđể chạy tập lệnh khi khởi động


2
Có thể làm việc cho bất cứ ai chạy hệ điều hành SysV lỗi thời, nhưng hầu như không liên quan.
Milliways
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.