Raspberry. Первые шаги "Интернета вещей"

Тема в разделе "Raspberry Pi", создана пользователем Salomatin, 3 апр 2017.

  1. Salomatin

    Salomatin Гик

    Raspberry Pi 3 удобен для модного сейчас понятия "Internet of Things"
    Предлагаю вниманию Пошаговые инструкции, в виде набора лабораторных работ.
    К лабораторным работам прилагаются готовые скрипты и короткие клипы без звука. Пояснения в тексте. Смотрите как выполнять команды, копируйте и вставляйте.
    Темы:
    Установка и первый запуск
    Управляем светодиодом
    Считываем кнопку
    Веб сервер с поддержкой PHP
    crontab - исполняем команды или скрипты по времени.
    Воспроизводим звуковые файлы
    Настройка OpenVPN клиента
    Сетевое хранилище. Подключаем внешний диск USB.
    Samba. Общий каталог - создание, совместный доступ, подключение
    ProFTPd (FTP - сервер)
    Яндекс.диск
    Подключаем Веб-камеру и смотрим на сайте
    74HC595 - множим выходы
    Подключение к Raspberry удаленных датчиков и средств автоматики
    Wi-Fi - подключение к роутеру, точка доступа, сам роутер
    Asterisk — свободное решение компьютерной телефонии
    Управляем на сайте через PHP
    (по мере готовности будут добавляться)

    Прошу не писать в эту тему вопросы или комментарии
    , а заводить отдельные.
     
    Последнее редактирование: 9 май 2017
    ARDUIN-щик, sys, BAR__MEN и 2 другим нравится это.
  2. Salomatin

    Salomatin Гик

    Установка и первый запуск

    Видеоролик можно скачать по адресу:


    Заходим
    https://www.raspberrypi.org/downloads/raspbian/
    скачиваем
    Raspbian Jessie Lite
    Minimal image based on Debian Jessie

    https://downloads.raspberrypi.org/raspbian_lite_latest
    Обращаю внимание, что использую не desktop, а чисто серверный вариант, без графики.
    В нашем случае это более подходит, занимает меньше места и не тратит лишние ресурсы
    В интернете много примеров для записи образа, например на базе Win32DiskImager
    Покажу как это делал в Linux

    Код (Bash):
    [root@dom pi3]# fdisk -l
    [root@dom pi3]# umount /dev/sdb1
    [root@dom pi3]# ls
    2017-03-02-raspbian-jessie-lite.img
    [root@dom pi3]# dd if=2017-03-02-raspbian-jessie-lite.img of=/dev/sdb bs=1M
    1329+0 записей получено
    1329+0 записей отправлено
    скопировано 1393557504 байта (1,4 GB), 139,811 c, 10,0 MB/c
    [root@dom pi3]# sync
    [root@dom pi3]# blkid
    /dev/sdb1: LABEL="boot" UUID="70CD-BC89" TYPE="vfat" PARTUUID="b2455b06-01"
    /dev/sdb2: UUID="8a9074c8-46fe-4807-8dc9-8ab1cb959010" TYPE="ext4" PARTUUID="b2455b06-02"
    Устр-во  Загрузочный начало Конец Секторы Размер Идентификатор Тип
    [root@dom pi3]# fdisk -l
    /dev/sdb1  8192  137215  129024  63M  c W95 FAT32 (LBA)
    /dev/sdb2  137216 2721791 2584576  1,2G  83 Linux

    Корректно извлекаем карту и вставляем CD-карту в Raspberry Pi 3. Подключаем устройство к локальной сети, в которой настройки DHCP раздаются автоматически. Также подключаем монитор, клавиатуру и блок питания. Мышь не нужна. Всего четыре провода. Включаем.

    Видим приглашение
    Код (Bash):
    Login:
    Набираем pi
    нажимаем "Ввод"
    Видим приглашение Пароль
    Код (Bash):
    password:
    raspberry
    нажимаем "Ввод"
    Получаем приглашение:
    Код (Bash):
    pi@raspberrypi:~ $

    Запускаем сервис ssh для удаленного доступа

    Код (Bash):
    pi@raspberrypi:~ $sudo service ssh start
    Узнаем IP адрес
    Код (Bash):
    pi@raspberrypi:~ $ ip a
    Смотрим какой адрес получил сервер
    обычно это типа 192.168.1.100
    На этом работа с самим устройством заканчивается. Само устройство пока не выключаем.

    Переходим на нашу рабочую станцию, любой виндос или линукс компьтер, за которым мы обычно работаем.
    В виндос используем консольную программу PuTTY
    У меня станция линукс.

    Итак заходим по ssh с любой удаленной рабочей станции в этой же локальной сети
    У меня это
    [vova@dom ~]$ ssh pi@172.16.5.40
    у вас другой адрес ( тот что вы узнали набрав команду ip a

    Код (Bash):
    pi@172.16.5.40's password:
    набираем в темную raspberry
    дальше возможно будет набрать yes
    получаем приглашение
    Код (Bash):
    pi@raspberrypi:~ $
    Задаем пароль суперпользователю root
    Код (Bash):
    pi@raspberrypi:~ $ sudo passwd
    меняем пароль пользователя pi
    Код (Bash):
    pi@raspberrypi:~ $ sudo passwd pi
    Ставим ssh в автозагрузку
    Код (Bash):
    pi@raspberrypi:~ $ sudo systemctl enable ssh
    Заходим root`ом
    Код (Bash):
    pi@raspberrypi:~ $ su -l
    Обновляем сведения о пакетах для apt-get
    Код (Bash):
    root@raspberrypi:~# apt-get update
    подгружаем пару полезных программ
    Код (Bash):
    root@raspberrypi:~# apt-get install mc htop
    Для сервера важно понятие время, иначе могут не работать некоторые сервисы
    Выставляем часовой пояс
    Код (Bash):
    root@raspberrypi:~# dpkg-reconfigure tzdata
    Синхронизируем время
    Код (Bash):
    root@raspberrypi:~# apt-get install ntp
    Код (Bash):
    root@raspberrypi:~# service ntp stop;ntpd -gq;service ntp start
    ntpd: time slew +0.002628s
    Проверяем
    Код (Bash):
    root@raspberrypi:~# date
    Знакомимся с монитором процессов
    Код (C++):
    pi@raspberrypi:~ $ htop
    Узнать температуру
    Код (Bash):
    pi@raspberrypi:~ $ /opt/vc/bin/vcgencmd measure_temp
    temp=52.6'C
    Знакомимся с файловым менеджером с текстовым интерфейсом, с файловой системой
    Код (Bash):
    root@raspberrypi:~# mc
    Если хотим, можем прописать статический IP адрес
    Открываем файл
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/dhcpcd.conf
    и в самый конец файла дописываем строки с данными своей локальной сети

    Код (Bash):
    interface eth0
    static ip_address=192.168.1.138/24
    static routers=192.168.1.1
    static domain_name_servers=192.168.1.1
    Если хотим, можем поменять имя сервера
    Открываем и правим два файла:

    Код (Bash):
    root@raspberrypi:~# mcedit /etc/hostname
    root@raspberrypi:~# mcedit /etc/hosts
    в этих файлах слово raspberrypi заменяем на любое ваше, но с маленькой буквы, без пробелов и специальных символов

    Перегружаем сервер
    Код (Bash):
    root@raspberrypi:~# reboot
    Проверяем возможность удаленного управления сервером по ssh
    Если все нормально, отсоединяем монитор и клавиатуру.
    Сервер корректно выключается удаленно командой
    от простого пользователя
    Код (Bash):
    pi@raspberrypi:~# sudo poweroff
    от рута
    Код (Bash):
    root@raspberrypi:~# poweroff
    Устройство можно переносить в любое удобное место. Подключать только блок питания и сеть интернет.
     
    Последнее редактирование: 16 ноя 2017
    BAR__MEN и Igor68 нравится это.
  3. Salomatin

    Salomatin Гик

    Управляем светодиодом
    Видеоролик можно скачать по адресу:



    По поисковой фразе raspberry pi 3 gpio находим картинку расположения gpio
    Подсоединяем светодиод через сопротивление 330 ом к 39 (GND) и 40 (CPIO21) ногам ( самые крайние со стороны USB порта)

    Собираем схемку:
    m1a.jpg

    Скачиваем готовый архив

    Код (Bash):
    pi@raspberrypi:~ $ wget -r --no-parent http://salomatin.ru/salomatin.tar
    --2017-04-02 14:41:46--  http://salomatin.ru/salomatin.tar
    Resolving salomatin.ru (salomatin.ru)... 94.24.254.74
    Connecting to salomatin.ru (salomatin.ru)|94.24.254.74|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 20480 (20K) [application/x-tar]
    Saving to: ‘salomatin.ru/salomatin.tar’

    salomatin.ru/salomatin.tar  100%[============================================>]  20.00K  --.-KB/s  in 0.002s

    2017-04-02 14:41:46 (9.73 MB/s) - ‘salomatin.ru/salomatin.tar’ saved [20480/20480]

    FINISHED --2017-04-02 14:41:46--
    Total wall clock time: 0.07s
    Downloaded: 1 files, 20K in 0.002s (9.73 MB/s)
     
    Распаковываем
    Код (Bash):
    pi@raspberrypi:~ $ tar -xvf salomatin.ru/salomatin.tar
    salomatin/
    salomatin/p.py
    salomatin/e2.py
    salomatin/pik.py
    salomatin/e5.py
    salomatin/e3.py
    salomatin/off.py
    salomatin/offhtml.py
    salomatin/blink.py
    salomatin/e1.py
    salomatin/on.py
    salomatin/onhtml.py
    salomatin/e4.py
     
    Смотрим содержание файла ( аналог маячка для arduino)
    Набираем
    Код (Bash):
    pi@raspberrypi:~ $ cat /home/pi/salomatin/blink.py
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time, os

    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    GPIO.setup(21, GPIO.OUT)

    while True :
    GPIO.output(21,True),
    time.sleep(0.5)
    GPIO.output(21,False),
    time.sleep(1)
     
    Запускаем скрипт командой:
    Код (Bash):
    pi@raspberrypi:~ $ /home/pi/salomatin/blink.py
    Светодиод начинает мигать.
    Если не мигает, возможно ошиблись полярностью. Ничего не сгорит. Спокойно разворачиваем светодиод в другую сторону.
    Чтобы остановить исполнение скрипта нажимаем одновременно Ctrl + с
    Скрипт останавливается в момент нажатия (светодиод может гореть или погаснуть)
    вываливается сообщение:
    Код (Bash):
    ^CTraceback (most recent call last):
      File "/home/pi/salomatin/blink.py", line 15, in <module>
      time.sleep(1)
    KeyboardInterrupt
     
    то есть момент, когда был остановлен

    Включение светодиода
    Смотрим содержание файла включения светодиода командой:
    Код (Bash):
    pi@raspberrypi:~ $ cat /home/pi/salomatin/on.py
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time, os

    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    GPIO.setup(21, GPIO.OUT)

    GPIO.output(21,True),
    print('21' + '  on ')
     
    Включаем светодиод
    Код (Bash):
    pi@raspberrypi:~ $ /home/pi/salomatin/on.py
    21  on
    Светодиод включился
    Выводится сообщение, что
    21 on
    то есть светодиод включили (сообщение не стандартное, придуманное автором)

    Смотрим содержание скрипта выключения светодиода командой:
    Код (Bash):
    pi@raspberrypi:~ $ cat /home/pi/salomatin/off.py
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time, os

    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    GPIO.setup(21, GPIO.OUT)

    GPIO.output(21,False),
    print('21' + '  off ')
    Выключаем светодиод
    Код (Bash):
    pi@raspberrypi:~ $ /home/pi/salomatin/off.py
    21  off
    Включаем светодиод и записываем сообщение в файл
    Код (Bash):
    pi@raspberrypi:~ $ cat /home/pi/salomatin/onhtml.py
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time, os
    from datetime import datetime

    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    GPIO.setup(21, GPIO.OUT)

    GPIO.output(21,True),
    print('21' + '  on ')

    f1 = "/home/pi/a2.html"
    a2 = open(f1, 'a')

    now = datetime.now()

    a2 = open(f1, 'a')
    a2.write('<br />' + '21' + '  on  ' + str(now) + '\n'),
    a2.close()
    pi@raspberrypi:~ $ /home/pi/salomatin/onhtml.py
    21  on
    Появился файл, а нем строка
    Код (Bash):
    pi@raspberrypi:~ $ cat /home/pi/a2.html
    <br />21  on  2017-04-02 15:16:07.458861
    <br /> символ кода html для просмотра на сайте, далее дата и время в миллисекундах

    Аналогично выключение
    Код (Bash):
    pi@raspberrypi:~ $ cat /home/pi/salomatin/offhtml.py
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time, os
    from datetime import datetime

    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    GPIO.setup(21, GPIO.OUT)

    GPIO.output(21,False),
    print('21' + '  off ')

    f1 = "/home/pi/a2.html"
    a2 = open(f1, 'a')

    now = datetime.now()

    a2 = open(f1, 'a')
    a2.write('<br />' + '21' + '  off ' + str(now) + '\n'),
    a2.close()

    pi@raspberrypi:~ $ /home/pi/salomatin/offhtml.py
    21  off
    pi@raspberrypi:~ $ cat /home/pi/a2.html
    <br />21  on  2017-04-02 15:16:07.458861
    <br />21  off 2017-04-02 15:18:26.147152
    Тестируем
     
    Последнее редактирование: 1 май 2017
    BAR__MEN нравится это.
  4. Salomatin

    Salomatin Гик

    Считываем кнопку
    Видеоролик можно скачать по адресу:



    Подсоединяем кнопку к CPIO19 , второй провод на GND

    kna.jpg

    Смотрим скрипт
    Код (Bash):
    pi@raspberrypi:~ $ cat /home/pi/salomatin/e1.py
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time

    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)

    GPIO.setup(19, GPIO.IN)
    GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # подтяжка к питанию


    p19 = GPIO.input(19)
    print(p19),
     
    Исполнение скрипта выводит 0 или 1, состояние кнопки. Нажата или отжата.
    Код (Bash):
    pi@raspberrypi:~ $ /home/pi/salomatin/e1.py
    1
    pi@raspberrypi:~ $ /home/pi/salomatin/e1.py
    0
    Следующий скрипт выводит уже номер контакта и время
    Код (Bash):
    pi@raspberrypi:~ $ cat /home/pi/salomatin/e2.py
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time
    from datetime import datetime


    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)

    GPIO.setup(19, GPIO.IN)
    GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # подтяжка к питанию


    now = datetime.now()

    if (GPIO.input(19)) == 0:
      print('19' + '  on  ' + str(now) + '\n'),

    if (GPIO.input(19)) == 1:
      print('19' + '  off  ' + str(now) + '\n'),

    pi@raspberrypi:~ $ /home/pi/salomatin/e2.py
    19  off  2017-04-02 15:56:20.495889
    pi@raspberrypi:~ $ /home/pi/salomatin/e2.py
    19  on  2017-04-02 15:56:25.215933
    Тоже самое но записью в файл
    Код (Bash):
    pi@raspberrypi:~ $ cat /home/pi/salomatin/e3.py
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time
    from datetime import datetime


    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)

    GPIO.setup(19, GPIO.IN)
    GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # подтяжка к питанию

    f1 = "/home/pi/a2.html"
    a2 = open(f1, 'a')

    now = datetime.now()

    if (GPIO.input(19)) == 0:
      a2 = open(f1, 'a')
      a2.write('<br />' + '19' + '  on  ' + str(now) + '\n'),
      a2.close()

      print('19' + '  on  ' + str(now) + '\n'),

    if (GPIO.input(19)) == 1:
      a2 = open(f1, 'a')
      a2.write('<br />' + '19' + '  off ' + str(now) + '\n'),
      a2.close()

      print('19' + '  off ' + str(now) + '\n'),



    pi@raspberrypi:~ $ /home/pi/salomatin/e3.py
    19  off 2017-04-02 15:58:13.287239
    pi@raspberrypi:~ $ cat /home/pi/a2.html
    <br />21  on  2017-04-02 15:33:52.795120
    <br />21  off 2017-04-02 15:34:20.846578
    <br />21  on  2017-04-02 15:34:43.948453
    <br />21  off 2017-04-02 15:34:48.754141
    <br />21  on  2017-04-02 15:34:51.673439
    <br />21  off 2017-04-02 15:34:55.654782
    <br />19  off 2017-04-02 15:58:13.287239
    Скрипт каждую секунду считывает состояние кнопки и записывает в файл
    Код (Bash):
    pi@raspberrypi:~ $ cat /home/pi/salomatin/e4.py
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time
    from datetime import datetime


    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)

    GPIO.setup(19, GPIO.IN)
    GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # подтяжка к питанию

    f1 = "/home/pi/a2.html"
    a2 = open(f1, 'a')

    while True :
      now = datetime.now()

      if (GPIO.input(19)) == 0:
      a2 = open(f1, 'a')
      a2.write('<br />' + '19' + '  on  ' + str(now) + '\n'),
      a2.close()

      print('19' + '  on  ' + str(now) + '\n'),

      if (GPIO.input(19)) == 1:
      a2 = open(f1, 'a')
      a2.write('<br />' + '19' + '  off ' + str(now) + '\n'),
      a2.close()

      print('19' + '  off ' + str(now) + '\n'),

      time.sleep(1)

    pi@raspberrypi:~ $ /home/pi/salomatin/e4.py
    19  off 2017-04-02 16:00:06.652762
    19  off 2017-04-02 16:00:07.654152
    19  on  2017-04-02 16:00:08.655448
    19  on  2017-04-02 16:00:09.656726
    19  off 2017-04-02 16:00:10.658155
    19  off 2017-04-02 16:00:11.659946
    ^CTraceback (most recent call last):
      File "/home/pi/salomatin/e4.py", line 30, in <module>
      a2.write('<br />' + '19' + '  off ' + str(now) + '\n'),
    KeyboardInterrupt
    pi@raspberrypi:~ $ cat /home/pi/a2.html
    <br />21  on  2017-04-02 15:33:52.795120
    <br />21  off 2017-04-02 15:34:20.846578
    <br />21  on  2017-04-02 15:34:43.948453
    <br />21  off 2017-04-02 15:34:48.754141
    <br />21  on  2017-04-02 15:34:51.673439
    <br />21  off 2017-04-02 15:34:55.654782
    <br />19  off 2017-04-02 15:58:13.287239
    <br />19  off 2017-04-02 16:00:06.652762
    <br />19  off 2017-04-02 16:00:07.654152
    <br />19  on  2017-04-02 16:00:08.655448
    <br />19  on  2017-04-02 16:00:09.656726
    <br />19  off 2017-04-02 16:00:10.658155
    <br />19  off 2017-04-02 16:00:11.659946
    Скрипт выводит только сам момент изменения состояния кнопки и записывает его в файл
    Код (Bash):
    pi@raspberrypi:~ $ cat /home/pi/salomatin/e5.py
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time
    from datetime import datetime


    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)

    GPIO.setup(19, GPIO.IN)
    GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # подтяжка к питанию

    f1 = "/home/pi/a2.html"
    a2 = open(f1, 'a')

    b19=0

    while True :
      now = datetime.now()

      if (GPIO.input(19)) == 0:
      if b19 == 1:
      a2 = open(f1, 'a')
      a2.write('<br />' + '19' + '  on  ' + str(now) + '\n'),
      a2.close()

      print('19' + '  on  ' + str(now) + '\n'),
      b19=0

      if (GPIO.input(19)) == 1:
      if b19 == 0:
      a2 = open(f1, 'a')
      a2.write('<br />' + '19' + '  off ' + str(now) + '\n'),
      a2.close()

      print('19' + '  off ' + str(now) + '\n'),
      b19=1

      time.sleep(0.1)

    pi@raspberrypi:~ $ /home/pi/salomatin/e5.py
    19  off 2017-04-02 16:02:15.899399
    19  on  2017-04-02 16:02:18.904095
    19  off 2017-04-02 16:02:19.104583
    19  on  2017-04-02 16:02:20.707408
    19  off 2017-04-02 16:02:20.908200
    ^CTraceback (most recent call last):
      File "/home/pi/salomatin/e5.py", line 41, in <module>
      time.sleep(0.1)
    KeyboardInterrupt
    pi@raspberrypi:~ $ cat /home/pi/a2.html
    <br />21  on  2017-04-02 15:33:52.795120
    <br />21  off 2017-04-02 15:34:20.846578
    <br />21  on  2017-04-02 15:34:43.948453
    <br />21  off 2017-04-02 15:34:48.754141
    <br />21  on  2017-04-02 15:34:51.673439
    <br />21  off 2017-04-02 15:34:55.654782
    <br />19  off 2017-04-02 15:58:13.287239
    <br />19  off 2017-04-02 16:00:06.652762
    <br />19  off 2017-04-02 16:00:07.654152
    <br />19  on  2017-04-02 16:00:08.655448
    <br />19  on  2017-04-02 16:00:09.656726
    <br />19  off 2017-04-02 16:00:10.658155
    <br />19  off 2017-04-02 16:00:11.659946
    <br />19  off 2017-04-02 16:02:15.899399
    <br />19  on  2017-04-02 16:02:18.904095
    <br />19  off 2017-04-02 16:02:19.104583
    <br />19  on  2017-04-02 16:02:20.707408
    <br />19  off 2017-04-02 16:02:20.908200
    Тестируем
     
    Последнее редактирование: 1 май 2017
    BAR__MEN нравится это.
  5. Salomatin

    Salomatin Гик

    Выводим состояние кнопки и светодиода на веб сайте
    nginx и php5-fpm для запуска PHP скриптов
    Видеоролик можно скачать по адресу:


    Обновляем сведения о пакетах
    Код (Bash):
    root@raspberrypi:~# apt-get update
    Устанавливаем
    Код (Bash):
    root@raspberrypi:~# apt-get install nginx php5 php5-fpm php5-mysql php5-cgi
    Включаем в автозагрузку
    Код (Bash):
    root@raspberrypi:~# systemctl enable nginx;systemctl enable php5-fpm;
    Правим файл /etc/nginx/sites-available/default
    Вставляем туда кусок
    Код (Bash):
    root /var/www/html;

      index index.php index.html index.htm index.nginx-debian.html;

      server_name _;

      location / {
      autoindex  on;
      autoindex_exact_size off;
      autoindex_localtime on;
      charset utf-8;
      }

    location ~ \.php$ {
      try_files $uri =404;
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
      }
    Привожу полный текст исправленного файла
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/nginx/sites-available/default

    root@raspberrypi:~# cat /etc/nginx/sites-available/default
    ##
    # You should look at the following URL's in order to grasp a solid understanding
    # of Nginx configuration files in order to fully unleash the power of Nginx.
    # http://wiki.nginx.org/Pitfalls
    # http://wiki.nginx.org/QuickStart
    # http://wiki.nginx.org/Configuration
    #
    # Generally, you will want to move this file somewhere, and start with a clean
    # file but keep this around for reference. Or just disable in sites-enabled.
    #
    # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
    ##

    # Default server configuration
    #
    server {
      listen 80 default_server;
      listen [::]:80 default_server;

      # SSL configuration
      #
      # listen 443 ssl default_server;
      # listen [::]:443 ssl default_server;
      #
      # Self signed certs generated by the ssl-cert package
      # Don't use them in a production server!
      #
      # include snippets/snakeoil.conf;




    root /var/www/html;

      index index.php index.html index.htm index.nginx-debian.html;

      server_name _;

      location / {
      autoindex  on;
      autoindex_exact_size off;
      autoindex_localtime on;
      charset utf-8;
      }

    location ~ \.php$ {
      try_files $uri =404;
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
      }








      # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
      #
      #location ~ \.php$ {
      #  include snippets/fastcgi-php.conf;
      #
      #  # With php5-cgi alone:
      #  fastcgi_pass 127.0.0.1:9000;
      #  # With php5-fpm:
      #  fastcgi_pass unix:/var/run/php5-fpm.sock;
      #}

      # deny access to .htaccess files, if Apache's document root
      # concurs with nginx's one
      #
      #location ~ /\.ht {
      #  deny all;
      #}
    }


    # Virtual Host configuration for example.com
    #
    # You can move that to a different file under sites-available/ and symlink that
    # to sites-enabled/ to enable it.
    #
    #server {
    #  listen 80;
    #  listen [::]:80;
    #
    #  server_name example.com;
    #
    #  root /var/www/example.com;
    #  index index.html;
    #
    #  location / {
    #  try_files $uri $uri/ =404;
    #  }
    #}
     
    В файле
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/php5/fpm/php.ini
     
    находим строку 771 , убираем комментарий впереди и заменяем единицу на ноль
    Код (Bash):
    cgi.fix_pathinfo=0
    создаем файл
    Код (Bash):
    root@raspberrypi:~# cat > /var/www/html/index.php
    с единственной строкой
    Код (Bash):
    <?php phpinfo(); ?>
    Должно получится так
    Код (Bash):
    root@raspberrypi:~# cat /var/www/html/index.php
    <?php phpinfo(); ?>
     
    Перегружаем сервисы
    Код (Bash):
    root@raspberrypi:~# service nginx restart;service php5-fpm restart
    по адресу нашего устройства должно появиться в браузере красочная таблица
    http://172.16.5.38/

    Создаем каталог
    Код (Bash):
    root@raspberrypi:~# mkdir /var/www/html/foto;chmod 777 /var/www/html/foto
    Делаем символическую ссылку
    Код (Bash):
    root@raspberrypi:~# ln -s /home/pi/a2.html /var/www/html/foto/a2.html
    и по адресу
    http://172.16.5.38/foto/a2.html
    видим наш файл с данными состояния кнопки и светодиода
    ( адрес у вас будет другой)

    Apache2 и php5 для запуска PHP скриптов

    Останавливаем предыдущий веб сервер
    Код (Bash):
    root@raspberrypi:~# service nginx stop
    Убираем из автозапуска
    Код (Bash):
    root@raspberrypi:~# systemctl disableenable nginx;
    Подгружаем
    Код (Bash):
    root@raspberrypi:~# apt-get install apache2 libapache2-mod-php5
    Перегружаем
    Код (Bash):
    root@raspberrypi:~# service apache2 restart
     
    ставим в автозагрузку
    Код (Bash):
    systemctl enable apache2
    по адресу нашего устройства смотрим в браузере красочную таблицу
    http://172.16.5.38/index.php
    помним что создали до этого файл
    Код (Bash):
    root@raspberrypi:~# cat /var/www/html/index.php
    <?php phpinfo(); ?>
     
    Последнее редактирование: 16 апр 2017
    Igor68 нравится это.
  6. Salomatin

    Salomatin Гик

    crontab
    Исполняем команды или скрипты по времени.
    набираем
    Код (Bash):
    pi@raspberrypi:~ $ crontab -e
    получаем вывод
    Код (Bash):
    pi@raspberrypi:~ $ crontab -e
    no crontab for pi - using an empty one

    /usr/bin/select-editor: 1: /usr/bin/select-editor: gettext: not found
    'select-editor'.
      1. /bin/ed
    /usr/bin/select-editor: 1: /usr/bin/select-editor: gettext: not found
      2. /bin/nano        <----
      3. /usr/bin/mcedit
      4. /usr/bin/vim.tiny

    /usr/bin/select-editor: 32: /usr/bin/select-editor: gettext: not found
    1-4 [2]:
    выбираем 3
    и открывается для редактирования файл
    вставляем строку
    Код (Bash):
    */1 * * * * date >> /home/pi/crintab.txt
    в конце обязательно нажимаем клавишу ENTER, так называемая "пустая строка", чтобы скрипт понимал, что предыдущая строка закончена полностью
    дальше F2 сохранить и F10 выходим
    Каждую минуту в файл /home/pi/crintab.txt будет вписывать вывод команды date
    исполнять любой скрипт, который исполняется данным пользователем просто в командной строке
    Например:
    Код (Bash):
    10 9 13 * 5 /home/pi/salomatin/on.py
    в 9 часов 10 минут каждую пятницу 13 числа загадочным образом будет загораться светодиод
    Подробнее формат команды man crontab или поиском по инету.
     
    Последнее редактирование: 18 апр 2017
    BAR__MEN и Igor68 нравится это.
  7. Salomatin

    Salomatin Гик

    По команде воспроизводим звуковой файл. Из файлов составляем фразы. Включаем по расписанию, по нажатию кнопки и по времени. Транслируем интернет-радио.

    Становимся рутом
    Код (Bash):
    pi@raspberrypi:~ $ su -l
    Обновляем сведения о пакетах
    Код (Bash):
    root@raspberrypi:~# apt-get update
    Устанавливаем два самых простых плеера
    Код (Bash):
    root@raspberrypi:~# apt-get install mpg123 mpg321
    выходим
    Код (Bash):
    root@raspberrypi:~# exit
    и уже от имени рядового пользователя скачиваем любой звуковой файл
    Код (Bash):
    pi@raspberrypi:~ $ wget salomatin.ru/klen.mp3
    HTTP request sent, awaiting response... 200 OK
    Length: 3304503 (3.2M) [audio/mpeg]
    Saving to: ‘klen.mp3’

    klen.mp3                    100%[============================================>]   3.15M  9.76MB/s   in 0.3s  

    2017-04-15 20:36:41 (9.76 MB/s) - ‘klen.mp3’ saved [3304503/3304503]
    Воспроизводим

    Код (Bash):
    pi@raspberrypi:~ $ mpg123 klen.mp3
    High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
            version 1.20.1; written and copyright by Michael Hipp and others
            free software (LGPL) without any warranty but with best wishes

    Playing MPEG stream 1 of 1: klen.mp3 ...

    MPEG 1.0 layer III, 128 kbit/s ABR, 44100 Hz joint-stereo
    Title:   Mr. Credo - Êëåí                Artist: Mr. Credo
    Comment:                                 Album:
    Year:                                    Genre:  Other
    ^C
    [0:44] Decoding of klen.mp3 finished.
     
    Уровень звука настраиваем
    Код (Bash):
    pi@raspberrypi:~ $ alsamixer
    нажимаем F6 и стрелочкой курсора выставляем нужную громкость

    Для примера некоторые интернет-станции
    Код (Bash):
    pi@raspberrypi:~ $ mpg123 http://nbn.101.ru:4000/ar_74_01
    pi@raspberrypi:~ $ mpg123 http://air.radiorecord.ru:8102/mdl_128
    pi@raspberrypi:~ $ mpg123 http://ep128server.streamr.ru:8030/ep128
     
     
    BAR__MEN и Igor68 нравится это.
  8. Salomatin

    Salomatin Гик

    Настройка OpenVPN клиента

    Высовываем наш Raspberry в интернет. Для этого подключаем его через сервис OpenVPN к серверу со статическим IP адресом ( Например хостинг-провайдер, где крутится ваш сайт)
    Ваш Raspberry получит локальный адрес, например 10.83.0.26, тогда хостинг-провайдер директивой nginx примерно такого типа:
    Код (Bash):
    location ~* /foto {
    proxy_pass http://10.83.0.26;
    }
     
    будет отправлять запросы на ваш Raspberry

    Итак

    На рабочей станции под любой удобной для вас операционной системой настраиваем клиента OptnVPN . Проверяем соединение с сервером. В результате получаем три файла (ключи и сертификат) и IP адрес сервера.
    Копируем файлы на Raspberry
    в моем примере
    Код (Bash):
    [root@dom private]# scp t5.key pi@172.16.5.38:/home/pi
    [root@dom certs]# scp ca-root.pem pi@172.16.5.38:/home/pi
    [root@dom certs]# scp t5.cert  pi@172.16.5.38:/home/pi
    Заходим на наш Raspberry и ставим
    Код (Bash):
    root@raspberrypi:~# apt-get install openvpn
    Берем готовый файл и его правим
    Код (Bash):
    root@raspberrypi:~# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/
    root@raspberrypi:~# mcedit /etc/openvpn/client.conf
     
    43 строка вместо
    Код (Bash):
    ;remote my-server-1 1194
    записываем IP адрес нашего OpenVPN сервера
    Код (Bash):
    remote 37.37.37.37 1194
    строка 89, вместо

    Код (Bash):
    ###ca ca.crt
    ###cert client.crt
    ###key client.key

    ca /etc/openvpn/ca-root.pem
    cert /etc/openvpn/t5.cert
    key /etc/openvpn/t5.key
    ставим комментарий
    Код (Bash):
    #ns-cert-type server
    копируем файлы

    Код (Bash):
    root@raspberrypi:~# cp /home/pi/ca-root.pem /etc/openvpn/
    root@raspberrypi:~# cp /home/pi/t5.cert /etc/openvpn/
    root@raspberrypi:~# cp /home/pi/t5.key /etc/openvpn/
     
    Запускаем клиента
    Код (Bash):
    root@raspberrypi:~# service openvpn start
    Проверяем появилось ли соединение
    Код (Bash):
    root@raspberrypi:~# ip a

    8: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
        link/none
        inet 10.83.0.26 peer 10.83.0.25/32 scope global tun0
           valid_lft forever preferred_lft forever
     
    Останавливаем
    Код (Bash):
    root@raspberrypi:~# service openvpn stop
    Проверяем, соединение исчезло

    Как дополнительная опция:
    Если в конец файла вставить /etc/openvpn/client.conf
    Код (Bash):
    redirect-gateway
    и перезапустить клиента, то все пакеты будут ходить только через сервер OpenVPN
     
    BAR__MEN и Igor68 нравится это.
  9. Salomatin

    Salomatin Гик

    Сетевое хранилище
    Подключаем внешние жесткие диски

    Подгружаем
    Код (Bash):
    root@raspberrypi:~# apt-get install ntfs-3g
    Подключаем по USB внешний диск.
    Находим под каким именем он появился
    Код (Bash):
    root@raspberrypi:~# fdisk -l
    у меня он
    Код (Bash):
    Device     Boot Start       End   Sectors   Size Id Type
    /dev/sda1          63 976768064 976768002 465.8G  7 HPFS/NTFS/exFAT
    Создаем точку монтирования
    Код (Bash):
    root@raspberrypi:~# mkdir /mnt/usb1
    root@raspberrypi:~# chmod 777 /mnt/usb1
    Монтируем диск
    Код (Bash):
    root@raspberrypi:~# mount -t ntfs-3g /dev/sda1 /mnt/usb1 -o force
     
    Видим его
    Код (Bash):
    root@raspberrypi:~# mount -t ntfs-3g /dev/sda1 /mnt/usb1 -o force
    root@raspberrypi:~# ls /mnt/usb1/
    EE  System Volume Information
     
    Размонтировать можно командой
    Код (Bash):
    root@raspberrypi:~# umount /dev/sda1 /mnt/usb1
    Проверяем
    Код (Bash):
    root@raspberrypi:~# ls /mnt/usb1/
    root@raspberrypi:~#
    Для автоматического монтирования правим файл
    открываем его
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/fstab
    и добавляем строчку
    /dev/sda1 /mnt/usbdrive ntfs-3g defaults,rw 0 1
    Код (Bash):
    proc            /proc           proc    defaults          0       0
    /dev/mmcblk0p1  /boot           vfat    defaults          0       2
    /dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
    /dev/sda1 /mnt/usbdrive ntfs-3g defaults,rw 0 1
    # a swapfile is not a swap partition, no line here
    #   use  dphys-swapfile swap[on|off]  for that
    перегружаем
    Код (Bash):
    root@raspberrypi:~# reboot
    Проверяем
    Код (Bash):
    pi@raspberrypi:~ $ ls /mnt/usb1/
    EE  System Volume Information
    Осторожно с функцией автомонтирования. Для работы можно дать команду и вручную.
    После того как вы внесли изменения в файл /etc/fstab, вы уже не сможете просто так перегрузить устройство при отсутсnвии диска USB. Надо будет подключать. В крайнем случае можно вынуть CD карту, открыть ее на рабочей станции, найти файл и убрать строчку.

    Таким же образом подключаем диски 2, 3, 4
     
    Igor68 нравится это.
  10. Salomatin

    Salomatin Гик

    Samba. Общий каталог - создание, совместный доступ, подключение
    Обновляем сведения о пакетах
    Код (Bash):
    root@raspberrypi:~# apt-get update
    Подгружаем
    Код (Bash):
    root@raspberrypi:~# apt-get install samba
    создаем каталог с правами общего доступа
    Код (Bash):
    root@raspberrypi:~# mkdir /home/public;chmod 777 /home/public
    сохраняем оригинал конфигурационного файла
    Код (Bash):
    root@raspberrypi:~# mv /etc/samba/smb.conf /etc/samba/smb.conf.old
    создаем новый файл
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/samba/smb.conf
    вставляем туда
    Код (Bash):
    [global]
    dos charset = CP866
    unix charset = utf8
    display charset = cp1251
    workgroup = WORKGROUP
    server string = Raspberry
    security = USER
    map to guest = Bad User

    [Public]
    path = /home/public
    read only = Yes
    guest ok = Yes
    browseable = yes
    writable = yes
    create mask = 0777
    force create mask = 0777
    directory mask = 0777
    Перегружаем
    Код (Bash):
    root@raspberrypi:~# systemctl restart smbd.service;systemctl restart nmbd.service
    Заходим как обычно "Сетевое окружение", находим наше устройство в сети и видим каталог Public . Вставляем и скачиваем файлы как обычно. Всем можно все.
    Если укажем общим каталогом наш внешний диск usb1 из нашей прошлой лабораторной, то получаем удобное сетевое хранилище.

    Включаем в автозагрузку
    Код (Bash):
    root@raspberrypi:~# systemctl enable smbd.service;systemctl enable nmbd.service
     
    Последнее редактирование: 11 май 2017
    Igor68 нравится это.
  11. Salomatin

    Salomatin Гик

    ProFTPd (FTP - сервер)

    Подгружаем
    Код (Bash):
    apt-get install proftpd
    программа начнет устанавливаться
    выскочит менюшка, выбрать
    standalone
    Сразу после установки все работает.
    Любым FTP -клиентом заходим на Raspberry по его IP адресу
    Входное имя pi
    пароль ваш для pi
    Попадаем в корень файловой системы
    В домашний каталог можем скачивать и закачивать файлы

    Открываем
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/proftpd/proftpd.conf
    строка 34 снимаем комментарий перед
    Код (Bash):
    DefaultRoot ~
    перегружаем
    Код (Bash):
    root@raspberrypi:~# service proftpd restart
    с этого момента попадаем сразу в домашний каталог и ограничены на сервере только рамками домашнего каталога

    Для входа анонимных пользователей

    открываем
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/proftpd/proftpd.conf
    начиная со стоки 147 убираем комментарии вначале каждой строки
    получаем
    Код (Bash):
     <Anonymous ~ftp>
       User><------><------><------>ftp
       Group<------><------><------><------>nogroup
       # We want clients to be able to login with "anonymous" as well as "ftp"
       UserAlias<--><------><------>anonymous ftp
       # Cosmetic changes, all files belongs to ftp user
       DirFakeUser<>on ftp
       DirFakeGroup on ftp

       RequireValidShell<--><------>off

       # Limit the maximum number of anonymous logins
       MaxClients<-><------><------>10

       # We want 'welcome.msg' displayed at login, and '.message' displayed
       # in each newly chdired directory.
       DisplayLogin><------><------>welcome.msg
       DisplayChdir><------>.message

       # Limit WRITE everywhere in the anonymous chroot
       <Directory *>
         <Limit WRITE>
    #       DenyAll
          AllowAll
         </Limit>
       </Directory>
    #   # Uncomment this if you're brave.
    #   # <Directory incoming>
    #   #   # Umask 022 is a good standard umask to prevent new files and dirs
    #   #   # (second parm) from being group and world writable.
    #   #   Umask<-><------><------><------>022  022
    #   #            <Limit READ WRITE>
    #   #            DenyAll
    #   #            </Limit>
    #   #            <Limit STOR>
    #   #            AllowAll
    #   #            </Limit>
    #   # </Directory>

    </Anonymous>

    # Include other custom configuration files
    Include /etc/proftpd/conf.d/
    Обратите внимание поставлен комментарий и добавлено слово

    Код (Bash):
    #       DenyAll
          AllowAll
    Код (Bash):
    root@raspberrypi:~# service proftpd restart
    Любым FTP клиентом входим чисто по IP адресу, без имени
    попадаем на сервер, специальный раздел для анонимных пользователей
    /srv/ftp/
    там видим любой закаченный нами до этого файл

    Подробнее читаем руководства по ProFTPd
     
    BAR__MEN и Igor68 нравится это.
  12. Salomatin

    Salomatin Гик

    Яндекс.Диск
    Обновляем сведения о пакетах
    Код (Bash):
    root@raspberrypi:~# apt-get update
    Подгружаем
    Код (Bash):
    root@raspberrypi:~# apt-get install davfs2
    спросит про разрешиение непривилегированным пользователям монтировать папку. На вопрос отвечаем Yes. Выходим из рута
    Код (Bash):
    root@raspberrypi:~# exit
    и от имени пользователя pi создаем точку монтирования
    Код (Bash):
    pi@raspberrypi:~ $ mkdir /home/pi/ya.disk;chmod -R 777 /home/pi/ya.disk
    Возвращаемся
    Код (Bash):
    pi@raspberrypi:~ $ su -l
    Password:
    монтируем
    Код (Bash):
    mount -t davfs https://webdav.yandex.ru /home/pi/ya.disk -o uid=pi,gid=pi,rw,file_mode=0777,dir_mode=0777
    попросят ввести логин и пароль от аккаунта Яндекс.Диск
    проверяем
    Код (Bash):
    root@raspberrypi:~# ls /home/pi/ya.disk/
    Видим файлы вашего яндекс.диска. Командой или исполняя скрипт можно добавлять туда файлы
    Размонтировать
    Код (Bash):
    root@raspberrypi:~# umount https://webdav.yandex.ru /home/pi/ya.disk
    /sbin/umount.davfs: waiting while mount.davfs (pid 1542) synchronizes the cache .. OK
    umount: /home/pi/ya.disk: not mounted
    Для того чтобы больше не спрашивало логин и пароль открываем
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/davfs2/secrets
    и в конец файла добавляем одну строку с вашим логином и паролем
    Код (Bash):
    https://webdav.yandex.ru Ваш_логин Ваш_пароль
    проверяем
    Код (Bash):
    mount -t davfs https://webdav.yandex.ru /home/pi/ya.disk -o uid=pi,gid=pi,rw,file_mode=0777,dir_mode=0777
    Добавим пользователя в группу davfs2 (в данном примере, наш пользователь это pi):
    Код (Bash):
    root@raspberrypi:~# usermod -aG davfs2 pi
    Для авто монтирования открываем
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/fstab
    и вписываем строку
    Код (Bash):
    proc            /proc           proc    defaults          0       0
    /dev/mmcblk0p1  /boot           vfat    defaults          0       2
    /dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
    https://webdav.yandex.ru /home/pi/ya.disk  davfs  rw,noexec,auto,user,async,_netdev,uid=pi,gid=pi  0  0
    # a swapfile is not a swap partition, no line here
    #   use  dphys-swapfile swap[on|off]  for that
    еще раз предупреждаю, что надо поосторожней с /etc/fstab

    Теперь фотографии с камеры или любые другие файлы вы можете посмотреть на вашем яндекс.диске в любом мобильном приложении. Надо только скриптом их скопировать в раздел /home/pi/ya.disk/
     
    Последнее редактирование: 22 апр 2017
    Igor68 нравится это.
  13. Salomatin

    Salomatin Гик

    Подключаем Веб-камеру и смотрим на сайте

    Видеоролик можно скачать по адресу:


    Обновляем сведения о пакетах
    Код (Bash):
    root@raspberrypi:~# apt-get update
    Устанавливаем
    Код (Bash):
    root@raspberrypi:~# apt-get install winff
    Подключаем через USB веб-камеру

    далее командой отправляем снимок в каталог, который нам виден на сайте
    Код (Bash):
    pi@raspberrypi:~ $ avconv -t 1 -f video4linux2 -s 1920x1080 -r 2 -i /dev/video0 /var/www/html/foto/%03d.jpg; rm -rf  001.jpg
    1920x1080 расширение моей камеры, у вас может быть другое
    avconv делает два снимка, первый удаляет, второй под именем 002.jpg сохраняет в каталоге foto
    ссылке
    http://172.16.5.38/foto/002.jpg
    Видим снимок с нашей камеры
    повторяем команду
    Код (Bash):
    pi@raspberrypi:~ $ avconv -t 1 -f video4linux2 -s 1920x1080 -r 2 -i /dev/video0 /var/www/html/foto/%03d.jpg; rm -rf  001.jpg
    Видим обновленное фото
     
    BAR__MEN и Igor68 нравится это.
  14. Salomatin

    Salomatin Гик

    74HC595 - множим выходы

    Классический маячок:

    Собираем схемку:
    74HC595.jpg
    Код:
    Код (Python):
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time, os


    LATCH = 16 # Pin  Latch clock
    CLK = 12 # Pin  shift clock
    dataBit = 21 # Pin  A

    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings (False)
    GPIO.setup(LATCH, GPIO.OUT)
    GPIO.setup(CLK, GPIO.OUT)
    GPIO.setup(dataBit, GPIO.OUT)


    GPIO.output(LATCH, 0)
    GPIO.output(CLK, 0)


    def pulseCLK():
        GPIO.output(CLK, 1)
       # time.sleep(.01)
        GPIO.output(CLK, 0)
        return

    def serLatch():
        GPIO.output(LATCH, 1)
       # time.sleep(.01)
        GPIO.output(LATCH, 0)
        return

    # MSB out first!
    def ssrWrite(value):
        for  x in range(0,8):
            temp = value & 0x80
            if temp == 0x80:
               GPIO.output(dataBit, 1) # data bit HIGH
            else:
               GPIO.output(dataBit, 0) # data bit LOW
            pulseCLK()
            value = value << 0x01 # shift left
        serLatch() # output byte
        return


    # convert an 8-bit number to a binary string
    def convBinary(value):
        binaryValue = '0b'
        for  x in range(0,8):
            temp = value & 0x80
            if temp == 0x80:
               binaryValue = binaryValue + '1'
            else:
                binaryValue = binaryValue + '0'
            value = value << 1
        return binaryValue

    while True :
      ssrWrite(1)
      time.sleep(0.5)
      ssrWrite(0)
      time.sleep(0.5)
     
    Тестируем

    Мигаем всеми выходами и по разному:
    74HC595a.jpg


    Код (Python):
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time, os


    LATCH = 16 # Pin  Latch clock
    CLK = 12 # Pin  shift clock
    dataBit = 21 # Pin  A

    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings (False)
    GPIO.setup(LATCH, GPIO.OUT)
    GPIO.setup(CLK, GPIO.OUT)
    GPIO.setup(dataBit, GPIO.OUT)


    GPIO.output(LATCH, 0)
    GPIO.output(CLK, 0)


    def pulseCLK():
        GPIO.output(CLK, 1)
       # time.sleep(.01)
        GPIO.output(CLK, 0)
        return

    def serLatch():
        GPIO.output(LATCH, 1)
       # time.sleep(.01)
        GPIO.output(LATCH, 0)
        return

    # MSB out first!
    def ssrWrite(value):
        for  x in range(0,8):
            temp = value & 0x80
            if temp == 0x80:
               GPIO.output(dataBit, 1) # data bit HIGH
            else:
               GPIO.output(dataBit, 0) # data bit LOW
            pulseCLK()
            value = value << 0x01 # shift left
        serLatch() # output byte
        return


    # convert an 8-bit number to a binary string
    def convBinary(value):
        binaryValue = '0b'
        for  x in range(0,8):
            temp = value & 0x80
            if temp == 0x80:
               binaryValue = binaryValue + '1'
            else:
                binaryValue = binaryValue + '0'
            value = value << 1
        return binaryValue

    t=0.5

    while True :
    #мигаем 1
      ssrWrite(1)
      time.sleep(t)
      ssrWrite(0)
      time.sleep(t)
      ssrWrite(1)
      time.sleep(t)
      ssrWrite(0)
      time.sleep(t)
    #сдвиг по одному
      ssrWrite(1)
      time.sleep(t)
      ssrWrite(0)
      ssrWrite(2)
      time.sleep(t)
      ssrWrite(0)
      ssrWrite(4)
      time.sleep(t)
      ssrWrite(0)
      ssrWrite(8)
      time.sleep(t)
      ssrWrite(0)
      ssrWrite(16)
      time.sleep(t)
      ssrWrite(0)
      ssrWrite(32)
      time.sleep(t)
      ssrWrite(0)
      ssrWrite(64)
      time.sleep(t)
      ssrWrite(0)
      ssrWrite(128)
      time.sleep(t)
      ssrWrite(0)
      # Все одновременно
      ssrWrite(255)
      time.sleep(t)
      ssrWrite(0)
      time.sleep(t)
      ssrWrite(255)
      time.sleep(t)
      ssrWrite(0)

    Две 74HC595

    74HC595b.jpg


    Код (Python):
    #! /usr/bin/env python
    # coding: utf-8

    import RPi.GPIO as GPIO
    import time, os


    LATCH = 16 # Pin  Latch clock
    CLK = 12 # Pin  shift clock
    dataBit = 21 # Pin  A
    dataBit1= 25

    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings (False)
    GPIO.setup(LATCH, GPIO.OUT)
    GPIO.setup(CLK, GPIO.OUT)
    GPIO.setup(dataBit, GPIO.OUT)
    GPIO.setup(dataBit1, GPIO.OUT)

    GPIO.output(LATCH, 0)
    GPIO.output(CLK, 0)


    def pulseCLK():
        GPIO.output(CLK, 1)
       # time.sleep(.01)
        GPIO.output(CLK, 0)
        return

    def serLatch():
        GPIO.output(LATCH, 1)
       # time.sleep(.01)
        GPIO.output(LATCH, 0)
        return

    # MSB out first!
    def ssrWrite(value):
        for  x in range(0,8):
            temp = value & 0x80
            if temp == 0x80:
               GPIO.output(dataBit, 1) # data bit HIGH
            else:
               GPIO.output(dataBit, 0) # data bit LOW
            pulseCLK()
            value = value << 0x01 # shift left
        serLatch() # output byte
        return

    def ssrWrite1(value):
        for  x in range(0,8):
            temp = value & 0x80
            if temp == 0x80:
               GPIO.output(dataBit1, 1) # data bit HIGH
            else:
               GPIO.output(dataBit1, 0) # data bit LOW
            pulseCLK()
            value = value << 0x01 # shift left
        serLatch() # output byte
        return

    # convert an 8-bit number to a binary string
    def convBinary(value):
        binaryValue = '0b'
        for  x in range(0,8):
            temp = value & 0x80
            if temp == 0x80:
               binaryValue = binaryValue + '1'
            else:
                binaryValue = binaryValue + '0'
            value = value << 1
        return binaryValue

    t=0.5

    while True :
     #мигаем 1
     ssrWrite(1)
     time.sleep(t)
     ssrWrite(0)
     time.sleep(t)
     ssrWrite(1)
     time.sleep(t)
     ssrWrite(0)
     time.sleep(t)
     #мигаем 2
     ssrWrite1(1)
     time.sleep(t)
     ssrWrite1(0)
     time.sleep(t)
     ssrWrite1(1)
     time.sleep(t)
     ssrWrite1(0)
     time.sleep(t)
     #сдвиг по одному
     ssrWrite(1)
     time.sleep(t)
     ssrWrite(0)
     ssrWrite(2)
     time.sleep(t)
     ssrWrite(0)
     ssrWrite(4)
     time.sleep(t)
     ssrWrite(0)
     ssrWrite(8)
     time.sleep(t)
     ssrWrite(0)
     ssrWrite(16)
     time.sleep(t)
     ssrWrite(0)
     ssrWrite(32)
     time.sleep(t)
     ssrWrite(0)
     ssrWrite(64)
     time.sleep(t)
     ssrWrite(0)
     ssrWrite(128)
     time.sleep(t)
     ssrWrite(0)
     ssrWrite1(1)
     time.sleep(t)
     ssrWrite1(0)
     ssrWrite1(2)
     time.sleep(t)
     ssrWrite1(0)
     ssrWrite1(4)
     time.sleep(t)
     ssrWrite1(0)
     ssrWrite1(8)
     time.sleep(t)
     ssrWrite1(0)
     ssrWrite1(16)
     time.sleep(t)
     ssrWrite1(0)
     ssrWrite1(32)
     time.sleep(t)
     ssrWrite1(0)
     ssrWrite1(64)
     time.sleep(t)
     ssrWrite1(0)
     ssrWrite1(128)
     time.sleep(t)
     ssrWrite1(0)
      # Все одновременно
     ssrWrite(255)
     ssrWrite1(255)
     time.sleep(t)
     ssrWrite(0)
     ssrWrite1(0)
     time.sleep(t)
     ssrWrite(255)
     ssrWrite1(255)
     time.sleep(t)
     ssrWrite(0)
     ssrWrite1(0)
    Тестируем.
     
    Последнее редактирование: 2 май 2017
  15. Salomatin

    Salomatin Гик

    Подключение к Raspberry удаленных датчиков и средств автоматики
    Для подключения удаленных датчиков и средств автоматики лучше использовать оптронную развязку, поднять напряжение вторичной цепи и увеличить силу тока. Так мы получим устойчивую и надежную работу. Сохраним Raspberry, в случае замыканий на линии.

    Для 12 вольт подойдет следующая схема:

    or.jpg

    Для выполнения лабораторных работ
    Управляем светодиодом
    Считываем кнопку

    12v.jpg

    Теперь можно разнести управление нагрузкой и считывание датчика на большое расстояние.
    Замените лампочку на нагрузку, а кнопку на удаленный датчик.
     
  16. Salomatin

    Salomatin Гик

    Wi-Fi - подключение к роутеру, точка доступа, сам роутер
    Настройка WiFi через командную строку

    Подключение к домашней сети Wi-Fi
    Сканируем на доступность сеть WI-Fi
    Код (Bash):
    pi@raspberrypi:~ $ iwlist wlan0 scan
    видим название знакомой нам сети в строчке
    ESSID:"myinet"
    а также другие доступные сети и много иной полезной информации.

    Открываем
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/wpa_supplicant/wpa_supplicant.conf
     
    вставляем в конец файла
    Код (Bash):
    country=GB
    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    network={
        ssid="myinet"
        psk="11111111"
    }
    через несколько секунд, Rasppberry попытается подключиться к сети. Если нет, то перезапустите интерфейс с помощью команды
    Код (Bash):
    root@raspberrypi:~# wpa_cli reconfigure
    вы можете узнать IP адрес
    Код (Bash):
    root@raspberrypi:~# ip a
    Если все нормально и вы видите что сетевой интерфейс wlan0 получил сетевой адрес, то можете выдергивать проводную витую пару и общаться со своим Raspberry через сеть Wi-Fi

    Если сеть, к которой вы подключаетесь, не использует пароль:
    Код (Bash):
    network={
        ssid="myinet"
        key_mgmt=NONE
    }

    Мы можем сами раздавать интернет
    Точка доступа:

    Подключаемся сотовым телефоном, буком или гаджетом напрямую к Raspberry
    (удаляем предыдущее соединение домашней сети, освобождая интерфейс wlan0)

    Обновляем сведения о пакетах
    Код (Bash):
    root@raspberrypi:~# apt-get update
    устанавливаем
    Код (Bash):
    root@raspberrypi:~# apt-get install hostapd
    добавляем
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/default/hostapd
    строчку
    Код (Bash):
    DAEMON_CONF="/etc/hostapd/hostapd.conf"
    в файле
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/hostapd/hostapd.conf
    записываем
    Код (Bash):
    interface=wlan0
    ssid=Raspberrypi
    hw_mode=g
    channel=6
    auth_algs=1
    wmm_enabled=0
    перегружаемся
    Код (Bash):
    root@raspberrypi:~# reboot
    и видим нашу сеть Raspberrypi, но подключиться пока не можем

    Ставим
    Код (Bash):
    root@raspberrypi:~# apt-get install isc-dhcp-server
    Присваиваем адрес
    Код (Bash):
    root@raspberrypi:~# ip addr add 192.168.11.1/24 dev wlan0
    Удаляем все содержимое и открываем пустой файл
    Код (Bash):
    root@raspberrypi:~# echo -n > /etc/dhcp/dhcpd.conf
    root@raspberrypi:~# mcedit /etc/dhcp/dhcpd.conf
    вставляем
    Код (Bash):
    subnet 192.168.11.0 netmask 255.255.255.0 {
    option routers 192.168.11.1;
    option domain-name-servers 8.8.8.8;
    option domain-name "localdomain";
    default-lease-time 3600;
    max-lease-time 3600;
    range 192.168.11.100 192.168.11.150;
    }
    перегружаем сервисы
    Код (Bash):
    root@raspberrypi:~# service isc-dhcp-server restart
    service hostapd restart
    Подключаемся без пароля.
    Если мы выполнили до этого
    Веб сервер с поддержкой PHP
    то можем c любого переносного устройства открыть страничку
    http://192.168.11.1/index.php
    или выполнили
    ProFTPd (FTP - сервер)
    то можем установить приложение FTP-клиент и скачивать или закачивать файлы напрямую.
    Для того чтобы работало после перезагрузки Raspberry
    Открываем
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/dhcpcd.conf
    в конец записываем
    Код (Bash):
    interface wlan0
    static ip_address=192.168.11.1/24
    также ставим в автозагрузку
    Код (Bash):
    root@raspberrypi:~# service isc-dhcp-server restart
    root@raspberrypi:~# systemctl enable isc-dhcp-server
    перегружаемся
    Код (Bash):
    root@raspberrypi:~# reboot
    Тестируем. Убеждаемся что wlan0 получил IP адрес
    Код (Bash):
    pi@raspberrypi:~ $ ip a
    и там есть строчка
    Код (Bash):
    inet 192.168.11.1/24 brd 192.168.11.255 scope global wlan0
     
    Роутер
    Разрешаем трансляцию пакетов
    заходим
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/sysctl.conf
    находим и снимаем знак #
    Код (Bash):
    net.ipv4.ip_forward=1
    создаем файл
    Код (Bash):
    root@raspberrypi:~# mcedit /root/iptables
    записываем туда
    Код (Bash):
    #!/bin/bash
    /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    /sbin/iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    /sbin/iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
    сохраняем и делаем исполняемым
    chmod g+rx
    Код (Bash):
    root@raspberrypi:~# chmod g+rx /root/iptables
    добавляем для исполнения сразу после загрузки
    Код (Bash):
    root@raspberrypi:~# crontab -e
    строку
    Код (Bash):
    @reboot /root/iptables &
     
    и в конце пустую строку
    сохраняем перегружаемся
    Тестируем.
     
    Последнее редактирование: 4 май 2017
    Igor68 нравится это.
  17. Salomatin

    Salomatin Гик

    Asterisk — свободное решение компьютерной телефонии
    Может многое. Звонить по событию, принимать звонки.
    Также как мигать светодиодом, для начала научимся самому простому - звонить на Raspberry и прослушивать звуковой файл.

    Обновляем сведения о пакетах
    Код (Bash):
    root@raspberrypi:~# apt-get update
    Подгружаем
    Код (Bash):
    root@raspberrypi:~# apt-get install asterisk
    Переименовываем
    Код (Bash):
    root@raspberrypi:~# mv /etc/asterisk/sip.conf /etc/asterisk/sip.conf.old;mv /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.old
    создаем
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/asterisk/sip.conf
    вставляем следующий текст:
    Код (Bash):
    [general]

    language=ru
    callgroup=1
    pickupgroup=1
    qualify=yes
    canreinvite=no


    [LOCAL-USERS](!)
    type=friend
    host=dynamic
    insecure=invite
    context=mysip
    disallow=all
    allow=alaw,ulaw
    nat=force_report,comedia
    directmedia=nonat

    [3001](LOCAL-USERS)
    username = 3001
    secret=333
    [3002](LOCAL-USERS)
    username = 3002
    secret=333
    Перезапускаем сервер
    Код (Bash):
    root@raspberrypi:~# service asterisk restart
    заходим в консоль Asteriskа
    Код (Bash):
    root@raspberrypi:~# asterisk -r
    и уже там
    Код (Bash):
    raspberrypi*CLI> sip show peers
    видим, что Asterisk готов принимать клиентов
    Код (Bash):
    Name/username             Host                                    Dyn Forcerport Comedia    ACL Port     Status      Description                
    3001/3001                 (Unspecified)                            D  No         Yes            0        UNKNOWN                                
    3002/3002                 (Unspecified)                            D  No         Yes            0        UNKNOWN                    
     
    Для подключения клиента используем следующие данные:
    Хост: 172.16.5.46 (это у меня IP адрес Raspberry)
    логин: 3001 ( в примере еще 3002)
    пароль: 333
    Далее типовая задача по подключению sip телефона.
    Берем клиента, IP телефон, которые имеют по нескольку линий, либо любой смартфон, компьютер, на который скачиваем приложение по поисковому слову SIP client. Заполняем три поля и добиваемся того, чтобы клиент вывел сообщение "Зарегистрирован"

    Заходим в консоль Asteriskа и проверяем

    Код (Bash):
    raspberrypi*CLI> sip show peers
    Name/username             Host                                    Dyn Forcerport Comedia    ACL Port     Status      Description                
    3001/3001                 172.16.5.34                              D  No         Yes            46849    OK (4 ms)                              
    3002/3002                 (Unspecified)                            D  No         Yes            0        UNKNOWN                      
    На моем примере видим подключение сотового телефона, который получил IP по wi-fi 172.16.5.34
    Диалплан
    В качестве первого Диаплана используем такую конструкцию:
    exten =>_XXXX,1,Answer() ; снять трубку
    exten =>_XXXX,n,MP3Player(/var/lib/asterisk/test.mp3) ; проиграть звуковой файл
    exten =>_XXXX,n,Hangup() ; отключиться
    Переходим к самому Диаплану
    Код (Bash):
    root@raspberrypi:~# mcedit /etc/asterisk/extensions.conf
    вставляем
    Код (Bash):
    [mysip]

    exten =>_XXXX,1,Answer()
    exten =>_XXXX,n,MP3Player(/var/lib/asterisk/test.mp3)
    exten =>_XXXX,n,Hangup()
    Загружаем плеер
    Код (Bash):
    root@raspberrypi:~# apt-get install mpg123
    закачаем на Raspberry тестовый файл
    Код (Bash):
    scp test.mp3 pi@172.16.5.36:/home/pi
    копируем для доступа asterisk
    Код (Bash):
    root@raspberrypi:~# cp /home/pi/test.mp3 /var/lib/asterisk/test.mp3
    разрешаем чтение
    Код (Bash):
    root@raspberrypi:~# chmod go+r /var/lib/asterisk/test.mp3
    Перезапускаем сервер
    Код (Bash):
    root@raspberrypi:~# service asterisk restart
    Звоним по любому 4-х значному номеру и слышим воспроизведение нашего тестового файла. После окончания происходит отбой. Поэтому для теста не используйте длинный проигрыш.

    После [mysip] добавляем и получаем
    Код (Bash):
    [mysip]
    exten => _XXXX,1,Dial(SIP/${EXTEN},,m)
    exten =>_5555,1,Answer()
    exten =>_5555,n,MP3Player(/var/lib/asterisk/test.mp3)
    exten =>_5555,n,Hangup()
    exten =>_5556,1,Answer()
    exten =>_5556,n,MP3Player(/var/lib/asterisk/test1.mp3)
    exten =>_5556,n,Hangup()
    Перезапускаем сервер
    Код (Bash):
    root@raspberrypi:~# service asterisk restart
    Регистрируем второго абонента под номером 3002
    Звоним друг другу, разговариваем как по обычному телефону.
    А если позвоним по номеру 5555, то получим воспроизведение звукового ролика.
    Звуковые файлы скриптом Rassberry может подменять. Таким образом вы можете узнать изменение состояние события.
    А если позвоним по номеру 5556, то получим воспроизведение другого звукового ролика, то есть другого события.

    Для связи по всему миру с вашим Raspberry лучше использовать IAX2 — Inter-Asterisk eXchange protocol — протокол обмена VoIP данными. Наиболее приспособлен к трансляции сетевых адресов NAT, в отличие от SIP и H.323 использует только один порт 4569 протокола UDP. Поэтому достаточно перебросить всего один порт и можете звонить из любой точки инета.
    Настройки там аналогичные sip.

    Таким образом никаких симок 3G/4G. Связь чисто по интернету или совместим с IP телефонией. Ваш Raspberry подключается как добавочный номер.
     
    Последнее редактирование: 9 май 2017
    BAR__MEN и Igor68 нравится это.
  18. debager

    debager Нерд

    Здорово спасибо !
    У меня робот катается с pi хочу звонить на динамики робота микрофон от webcam можно использовать.
    1) авто-снятье трубки при звонке консольный sip клиент без интерфейса
    2) звонок на указанный номер при нажатие на роботе
    можно дописать статью для SIP asterisk для моей задачи!
     
    Последнее редактирование: 22 июн 2017
    BAR__MEN нравится это.