Установил windows на новенький raspbery pi b 3. Подключаю ethernet кабель к роутеру - никакой реакции. Ноутбук с этим же кабелем к роутеру подключается без проблем. Помогите, пожалуйста, в чём может быть проблема?

pi
Сообщения
-
Windows не работает ethernet -
Малинка мгновенно нагреваетсяRaspberry Pi3, Raspbian. Средствами Berry Boot загрузчик оставлен на SD, а система установлена на внешний USB HDD. Питание достаточное. Связка работала нормально до установки Kodi. Вернее с установкой тоже работает, проблемы начинаются с запуском Kodi.Курсор практически висит с редкими рывками, HDD постоянно занят (судя по индикаторам, стоит в адаптере), за пара минут температура процессора подскакивает до 80 и выше, начинает мигать, а потом гореть индикатор перегрева (красный термометр на экране). Причем не фильм, просто запуск Kodi.Вопрос: куда копать?Спасибо всем, кто откликнется.
-
не работает кулерна днях купил малинку, доволен :)одновременнно с ней приехал бокс https://www.chipdip.ru/product/raspberry-pi-b-acrylic-enclosure-w-cpu-fan
втыкаю кулер в 4-й (красный) и 6 пин (черный) - кулер не крутится, в чём может быть дело? нужно ли как-то настраивать GPIO? -
Не загружается...Час добрый!Народ, помогите пожалуйста с raspberry Pi3 B. Проблема в том, что до недавнего времени прекрасно работающее устройство перестало запускаться. Горит красный светодиод, зеленый-ноль эмоций. Из предпосылок для поломки было лишь то, что в слоту сломалась пополам карта и грелась ужасно. Перед тем, как описать сюда свою проблему, прочел очень много форумов ответы на мои вопросы в которых, к сожаению, результата не дали. Первым делом менял SD карты, штук 5 точно сменил разных классов, но как правило десятый-нет результата, разные ОС-аналогично. Питание с разных, качественных источников подавал от 1А до 3А-безрезультатно. Подавал питание на GPIO 2 и 6 - тоже результата нет. На гребенке напряжение присутствует, при подключении мышки к USB порту светодиод (мыши) на короткое время моргает. Изображения, естественно через HDMI на экране нет . Может кто разбирался в схемотехнике данного устройства, подскажите, на какие момент обратить особое внимание и как выяснить в работе основные узлы или нет(процессор и т.д.)? Или при описанных симптомах смысла дальше продолжать нет, только в мусор?
-
Разноцветный квадратПомогите разобраться дорогие люди, при включении получаю разноцветный квадрат. Пробовал три различные sd карты с различными образами. Красный диод горит, зелёный моргает два раза ярко и один раз тускло и висит на радуге, при этом со временем на экране появляется значек градусника
-
Треклятый Wi-FiНакипело.
Прочитав кучу разной бесполезной инф. Наприменяв различных настроек, раз десять валил retropie если не больше, после применения настроек и бестолковых обновлений пакетов. Выше скорости 54 мбит не подключался, хоть ты тресни.Я даже репитер купил, но не помогло.Цитирую"Wi-Fi is disabled because the country is not set.Use raspi-config to set the country before use."
И как по вашему я должен поступить и многие другие пользователи, ясен пень настроить страну.Вот в этом весь и подвох. Если вы так сделаете то усе, 150 мбит вам не видать, причем я специально пробовал различные страны, что бы не было выбрано итог один максимум 54 мбит.
Да у меня raspberry pi3B+, но я думаю что это не приципиально, мне попадались упоминания о проблеме 15 и ранее годов. И даже на тестах в обзорах много где проскакивало 54 мбит.Как так, кому этот вопрос задать что ядро скорость подключения занижает?
-
После длительного использования зависает МалинкаДобрый день!Использую Raspberry 3 B+ в системе умного дома на ней крутятся node-red, mosqutto, необходимо функционирования 24/7. Но периодически,примерно, раз в неделю, малинка зависает, недоступна по ssh и не пингуется, приходится перезагружать по питанию.Малинка подключается по Wi-Fi к домашней сети.Карту памяти менял - не помогло.Блок питания менял - не помогло.Грешу на Wi-Fi подключение, как-то можно после перезагрузки по питанию, посмотреть логи которые писались до перезагрузки?
-
Не работает wi-fiПолучил pi3, стоит raspbian 4.9.2-10 (скачана с офф сайта, ставил как через noobs, так и заливкой на флешку готового образа.), Linux 4.4.34-v7+(armv7l). На чистую систему установлен только NoMachine. Не получается подключиться к wi-fi — сети находит, ключ спрашивает, когда ввожу — никакой реакции, не подключается. Снял пароль с сети, поменял регион на ru, каналы на маршрутизаторе (tp-link 1043nd, openwrt) — всё нипочем. Пытался подключиться к точке доступа своего смартфона (Meizu m2 note), результат то же. По lan сеть есть, но нужен wi-fi. ifconfig показывает, что не идут Tx-пакеты.
Содержимое файлов:
/etc/network/interfaces
source-directory /etc/network/interfaces.dauto lo
iface lo inet loopbackiface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
/etc/wpa_supplicant/wpa_supplicant.conf
trl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=RUnetwork={
ssid=«Op»
key_mgmt=NONE
} -
Вопросы по работе с Python библиотекой RPi.GPIO и RPIOВопросы по работе с Python библиотекой RPi.GPIO и
https://pypi.org/project/RPIO/
https://pypi.org/project/RPi.GPIO/ -
Вопросы по работе с библиотекой wiringPiВопросы по работе с библиотекой wiringPi
https://raspberrypi.ru/forum/topic/20/wiring-pi-библиотека-работы-с-gpio-часть-1 -
Вопросы по работе с библиотекой pigpioВопросы по работе с библиотекой pigpio
http://abyz.me.uk/rpi/pigpio
Особенностью библиотеки является высокая скорость опроса GPIO и точность программной ШИМ благодаря использованию DMA, доступ к которой осуществляется через недокументированные функии процессора (GPU mailboxes).Не работает на Raspberry Pi 5 в связи с тем, что обработка GPIO вынесена с процессора на отдельный чип RP1
-
Удаленное управление. QML.И всем снова привет.
Тут вспомнил еще про один проект, который построен на базе ferro_remote клиента.
Это QML клиент. Тем, кто не знает, что это такое можно прочитать тут + много русскоязычных источников. QML это простой язык описания визуального интерфейса со встроенным JS. Была когда-то идея купить себе Jolla, интерфейс, которой построен именно на QML.
Проект, который входит в дерево ferro_remote. Пока я его подзабросил, потому как телефон Jolla я так и не купил.
Вот про этот клиент я и напишу сейчас.
gui_client, а именно так называется этот клиент (с названиями у меня туго, да) представляет собой обычный бинарник, который принимает в командную строку путь к QML файлу, экспортирует в машину некоторые интерфейсы клиента и исполняет файл. Все просто. Все очень похоже на работу lua_client, который я тут описывал не так давно. Есть, однако, пара моментов.
Клиентов в одном экземпляре QML может быть несколько, каждый может быть соединен со своим агентом
Соединяться нужно из скрипта, то есть вызывать методы клиента и реагировать на его события (сигналы)
Тут еще стоит отметить, что собранного бинарника для той же винды у меня нет, потому как под рукой нет самой винды с QtCreator.И так. Запуск приложения выглядит вот так
$ ./gui_client test.qml
где test.qml это как раз само окно приложения со всем, что необходимо.
Самый простой пример:
import QtQuick 2.0 Rectangle { id: mainWindow }
Теперь, если это запустить, мы получим просто белое окошко, которое можно свернуть, развернуть, или закрыть
Но нужно ж соединиться с малиной, например. Добавим.
import QtQuick 2.0 import Fr.Client 1.0 /// импорт клиента и некоторых интерфейсов Rectangle { id: mainWindow FrClient { // клиент id: generalClient Component.onCompleted: connect( "192.168.3.1:12345" ) // соединимся с малиной } }
Все. Вызов: (Далее просто можно закрыть)
$ ./gui_client test.qml
В логах агента на стороне малины будет:
2000-Jan-11 02:38:19.472011 [INF] [listener] New connection: ep: tcp://0.0.0.0:12345 client: tcp://192.168.3.10:52849 total: 1 2000-Jan-11 02:38:26.854824 [INF] [listener] tcp://0.0.0.0:12345 Close connection: tcp://192.168.3.10:52849; count: 0
Этот код можно немного причесать и получить что-то типа такого
Сам QML файл лежит тут. Он соединяется, разъединяется, показывает ошибку, если возникла.
Можно сделать что-то поинтереснее. Например валяется у меня Grove LCD RGB.
Как известно из даташита на это устройство, устройства в этой железке 2. Первое отвечает за текст, второе за цвет экранчика. Оба рулятся по i2c. Все должно быть просто.
Кстати сам экранчик выглядит вот так
Это он подключен не к малинке, если что. Просто такой же девайсик с линуксом на борту и агентом ferro_remote.
Для того, чтоб уметь работать с устройством, добавлю 2 компонента FrClientI2C:
Rectangle { // это будет общий компонент-девайс, который мы сможет потом,
// например, вынести в отдельный файл
id: lcdDevice
width: 0
height: 0
FrClientI2c {
id: txtDev // этот для текста
client: generalClient // использовать клиента с id generalClient
busId: 1 // шина 1
slaveAddress: 0x3E // адрес
}FrClientI2c { id: rgbDev // этот для цвета client: generalClient busId: 1 slaveAddress: 0x62 }
}
Что тут происходит:
Компоненты будут готовы к работе, как только клиент будет соединен с агентом. У каждого компонента (если я нигде не забыл это воткнуть), есть свойство ready и соответственно сигнал "onReadyChanged", в которой передается значение ready (true or false).
Поэтому прям в компонент lcdDevice можно добавить свойство, которое принесет с собой и сигналы, на которые можно реагировать:
Rectangle { id: lcdDevice width: 0 height: 0 property bool ready: txtDev.ready && rgbDev.ready // привяжем состояние 2 устройств к 1 значению
........
onReadyChanged: { // устройства изменили состояния
if( ready ) {
..... // оба устройства готовы.
}
}
}
Добавим в код пару функций. Первая будет менять цвет, вторая очищать экран.Rectangle { id: lcdDevice ...... function set_color( r, g, b ) { // установка цвета. за это отвечают 3 регистра. rgbDev.writeBytes( { 0x04: r, 0x03: g, 0x02: b } ) } function clear( ) { // очистка экрана - установка регистра 0x80 в 1 txtDev.writeBytes( { 0x80: 0x01 } ) } }
и теперь можно при готовности устройств очистить их и сбросить цвет на 0
onReadyChanged: { if( ready ) { clear( ) set_color( 0, 0, 0 ) } }
Так при подключении программка будет убирать текст с экрана и устанавливать цвет в 0x000000 то есть он будет выключен.
Добавлю функцию для установки текста. Я сделаю функцию с 2 параметрами, так как строк у экранчика 2.
/// собственно функция формирует массив из объектов, которые выглядят так: {registry: value} /// после этого все это пишется в устройство. /// тут, при использовании массива будет гарантия того, /// что значение регистров будет установлено ровно в той последовательности, /// в какой они поступят в массив. /// 0x40 - регистр, который пишет свое значение в следующее знакоместо. function set_text( txt, txt2 ) { /// сначала очистка экрана и установка курсора с положение 1:1 txtDev.writeBytes( [{ 0x80: 0x01 }, { 0x80: 0x08 | 0x4 }, { 0x80: 0x28 }] ) var txt_value = [] /// значение регистров для записи текста
for( var i = 0; i < txt.length; i++ ) { txt_value = txt_value.concat( [{ 0x40: txt.charCodeAt(i) }] ) } txt_value = txt_value.concat({ 0x80: 0xC0 }) /// переход на 2 строку. for( i = 0; i < txt2.length; i++ ) { txt_value = txt_value.concat( [{ 0x40: txt2.charCodeAt(i) }] ) } txtDev.writeBytes(txt_value) /// Пишем. }
Если все правильно, то после вызова функции мы увидим на экранчике текст, переданный в параметрах.
onReadyChanged: { if( ready ) { //clear( ) set_color( 100, 100, 100 ) set_text( "Hola,", "raspberrypi.ru" ) } }
Запустив и подключив, мы увидим светлый экран и надпись на нем "Hola,\nraspberrypi.ru"
Дальше - больше.
Я добавил ColorDialog из "QtQuick.Dialogs 1.0" и повесил событие смены текущего цвета на смену цвета экрана.
Скрипт можно взять тут. Скрипты немного корявенькие, потому как это вообще первый мой проект, как с QML, так и с Qt вообще.
PS: есть еще примеры работы с удаленным исполнением консольной команды, с листингом директории.
- Есть работа с пинами GPIO и, недавно начал прикручивать, SPI.
Так же при помощи QML можно легко и непринужденно смотреть видео с железки
Rectangle { width: 600 height: 200 Video { anchors.fill: parent source: "rtsp://192.168.3.1:554/video" enabled: true visible: true focus: true autoPlay: true } }
Пока все. Спасибо за внимание
-
Радиостанция на основе Raspberry Pi 2B
Внимание! Данная инструкция применима только к RPI 2B. Для RPI 1 есть другая официальная инструкция. Также автор статьи не несет ответственности за ваши действия и все вы делаете на свой страх и риск.Для того,чтобы заставить нашу малинку работать как фм передатчик нам потребуется:
1)Кусок провода длиной 20см(Оптимальная длина:при антенне такой длины радиус действия составляет примерно 100 метров)
2)Прямые руки
И еще желательно иметь один проводок Мама-Мама.
Для начала присоединим провод длиной 20 см к GPIO4 на плате(7 пин на гребенке P1)
Теперь создадим директорию PiFm командой
mkdir PiFm
И перейдем в нее
cd PiFm
Затем установим программу архиватор
apt-get install zip -y
И загрузим архив с кодом программы wget h*ttps://goo.gl/XEyLuL (дополнение автора:необходимо убрать звездочку после h)
Распакуем архив
unzip XEyLuL
Перейдем в директорию
cd Pi2Fm
Теперь нам необходимо компиляция нашего кода
sudo gcc -lm -std=c99 pifm.c
Для начала вещания следует выполнить
sudo ./a.out sound.wav 108.0
где sound.wav название файла , а 108.0 частота.
Рекомендуется использовать только гражданские(27 mhz) и ФМ частоты(96-110mhz),чтобы не было проблем с законом.
Для прекращения вещания нажмите CTRL+C
-
Делаем из Raspberry Pi эмулятор консолейВсе нижеописанное вы делаете на свой страх и риск
Для начала рекомендую вам выставить максимально допустимый объем видеопамяти через raspi-config.
А еще нам понадобиться джойстик,без него никак,консоли эмулируем все таки.
Приступим
Установим пару необходимых нам программ
sudo apt-get install git dialog -y
Теперь мы загрузим скрипт установки с GitHub
mkdir ~/git_dir cd ~/git_dir git clone ht*tps://github.com/RetroPie/RetroPie-Setup.git //нужно убрать * cd RetroPie-Setup
И запустим его
sudo ./retropie_setup.sh
И выберем все так же как и на картинке
Дальше следуем инструкциям установщика и дожидаемся конца установки. Для запуска используем команду
emulationstation или sudo emulationstation
Для того,чтобы выйти нажимаем F4 или CTRL+C.На этом все,спасибо за внимание!
-
Подключение Raspberry Pi к телефону по Bluetooth. Часть 1В этой статье мы рассмотрим как установить связь между смартфоном и Raspberry Pi по Bluetooth, и в каких полезных целях можно данное соединение использовать.
Что потребуется:
-
Телефон с поддержкой Bluetooth (я тестировал на Android смартфоне Huawei)
-
USB-Bluetooth модуль для Raspberry Pi (покупал такой http://smarteletronika.com/viewproduct/76/
-
Дополнительное программное обеспечение
Загружаем Raspberry Pi и подключаем Bluetooth USB модуль. В Raspbian модуль работает "из коробки" и никаких дополнительных драйверов устанавливать не надо.
Устанавливаем необходимое ПО
sudo apt-get install bluetooth bluez-utils bluez-compat
Получаем список доступных Bluetooth устройств, к которым может подключиться Raspberry Pi (не забудьте сделать смартфон видимым для других BT устройств в настройках):
hcitool scan
В ответ на эту команду появится список доступных для сопряжения устройств. Ищем в списке наше и берём его адрес (у меня 18:34:51:55:B0:D8)
Устанавливаем соединение между Raspberry Pi и смартфоном (Перед установкой соединения нужно отредактировать скрипт /usr/bin/bluez-simple-agent следующим образом - открываем скрипт в текстовом редакторе и меняем строчку capability = "KeyboardDisplay" на capability = "DisplayYesNo"):
bluez-simple-agent hci0 18:34:51:55:B0:D8
В ответ в консоли Raspberry Pi должен появится запрос подтверждения, одновременно на экране смартфона появляется запрос на разрешение сопряжения:
RequestConfirmation (/org/bluez/2184/hci0/dev_20_F3_A3_E2_D7_49, 100111) Confirm passkey (yes/no):
Отвечаем "yes" и нажимаем кнопку "Сопряжение" в окне запроса на смартфоне.
Если всё прошло успещно, то скрипт bluez-simple-agent должен вывести надпись
Release New device (/org/bluez/2184/hci0/dev_20_F3_A3_E2_D7_49)
Всё - теперь соединение успешно установлено.
В следующих частях этой статьи мы рассмотрим как проигрывать музыку со смартфона на Raspberry Pi, а также осуществлять звонки и слать sms-сообщения
-
-
Чистый звук на Raspberry Pi, подключаем USB звуковую картуКак известно звук с аналогового аудиовыхода Raspberry Pi не отличается высоким качеством и наполнен посторонними шумами, что особенно заметно при большой громкости динамиков.
Для получения качественного звука лучше подключить по USB внешнюю звуковую карту. Помимо улучшения качества аудио, звуковая карта обладает входом для микрофона, что также весьма полезно.
Чтобы не заморачиваться с драйверами я выбрал звуковую карту с чипом c-Media, т.к c-Media работает в Raspbian "из коробки".
Также я приобрёл простой микрофон и аудио набор с двумя трёхватными минидинамиками и усилителем для них, который питается от 5V - 5V можно взять с GPIO разъёма Raspberry Pi.
Чтобы USB звуковая карта использовалась по умолчанию, необходимо внести изменения в файл /etc/modprobe.d/alsa-base.conf,
заменив в нём строчку
options snd-usb-audio index=-2
на
options snd-usb-audio index=0
и перезагрузиться
Для записи звука с микрофона можно воспользоваться программой arecord из пакета alsa-utils:
arecord -D plughw:0 -r 48000 test.wav -d 5
- -D имя устройства
- -r битрейт
- -d длительность записи в секундах
- test.wav имя записываемого файла
Вот так выглядит система в сборе:
-
Индикатор новых сообщений в GmailВ этой статье рассказывается, как сделать индикатор новых сообщений в Gmail для Raspberry Pi. Для этого понадобится программа на языке Python длиной всего в 10 строк! Если в подключенной учетной записи Gmail имеются новые сообщения, то светодиод загорается, если непрочитанных сообщений нет, он гаснет.
Проект основан на основе аналогичного для Arduino и Mac OS X.
Скрипт на Python для упрощения проверки сообщений на Gmail использует модуль feedparser, а также модуль RPi.GPIO для управления выводами шины GPIO. Самый простой способ устанавливать модули Python, это менеджер пакетов Pythonpip. Для установки pip используйте команду apt-get.
Замечание: для свежих версий Raspbian (после 15.07.2012) также потребуется пакет с заголовочными файлами python2.7-dev.
Наберите в консоли терминала:
sudo apt-get install python-pip python2.7-dev
Теперь, для того, чтобы pip правильно заработал, нужно обновить пакет distribute с помощью программы easy_install:
sudo easy_install -U distribute
Теперь, с помощью pip установим модули feedparser и GPIO:
sudo pip install feedparser RPi.GPIO
Наконец, все приготовления выполнены. Cкопируйте текст скрипта в файл raspi_gmail.py на Raspberry Pi:
import RPi.GPIO as GPIO, feedparser USERNAME="username@gmail.com" PASSWORD="password" GPIO_PIN=12 GPIO.setmode(GPIO.BOARD) GPIO.setup(GPIO_PIN, GPIO.OUT) newmails = int(feedparser.parse("https://" + USERNAME + ":" + PASSWORD + "@mail.google.com/gmail/feed/atom")["feed"]["fullcount"]) if newmails > 0: GPIO.output(GPIO_PIN, True) else: GPIO.output(GPIO_PIN, False)
Теперь осталось только добавить задачу вcronдля запуска каждую минуту. Для этого, откройте для редактирования файл конфигурации командой:
sudo crontab -e
Добавьте эту строку в конце файла (проверьте путь к скрипту):
* * * * * python /home/pi/raspi_gmail.py
Все готово!
С этого момента cron будет запускать наш скрипт каждую минуту. Если в Gmail есть непрочитанные сообщения, то 12-й вывод GPIO будет в состоянии логической единицы и светодиод будет гореть, в противном случае, на выводе будет логический ноль и светодиод не будет гореть.
Оригинал статьи на английском языке: http://mitchtech.net/raspberry-pi-physical-gmail-notifier/?utm_source=rss&utm_medium=rss&utm_campaign=raspberry-pi-physical-gmail-notifier
Оригинал статьи на русском языке: http://www.armlinux.ru/индикатор-новых-сообщений-в-gmail/
Хотелось рассказать об еще одном простом применении Raspberry Pi. Интересно получится ли у вас сделать такой индикатор. Я все делал по инструкции, но почему-то скрипт не работает. Я отредактировал код и теперь этот скрипт просто включает светодиод.
import RPi.GPIO as GPIO GPIO_PIN=12 GPIO.setmode(GPIO.BOARD) GPIO.setup(GPIO_PIN, GPIO.OUT) GPIO.output(GPIO_PIN, True)
Надеюсь, что у вас все получится, если вы будете делать подобный индикатор!
-
MP3 плеер за полчасаОсталось 2 часа до долгой поездки. Собираешь вещи, готовишься. Проверяешь всё. А тут бац! и плеер не работает. Печалька( На телефоне нет памяти, так что не получится с него слушать. Что же делать? Конечно же собирать самому. Особенно если есть Raspberry Pi.
Сначала думаем что он должен уметь:
- кнопка следующая песня
- кнопка пауза
- воспроизводить музыку в случайном порядке
- кнопка выключение
- кнопки звук больше меньше
- светодиод-индикатор
В наличии была ардуинка, куча разных atmeg. Но мой выбор пал на Raspberry pi model B 512 Mb. Решил, что это будет самый простой вариант. У неё есть разъёмы gpio, которые можно использовать для кнопок и светодиода. На малинке стоит Raspbian. Писать решил на python'e через редактор nano, работа c gpio через библиотеку RPi.GPIO, а что бы не мучиться с python кодеками и несовместимостью с arm — буду взаимодействовать со сторонним проигрывателем mplayer через subprocess.Popen(...).
Схема сверх простая
Реализация примерно такая (извините за такой вид. Просто сделано за пол часа...) Фотки
sudo apt-get install mplayer
Эээээх… программа… только не орите! Я знаю что это самое ужасное, что я когда либо писал. Когда ехал сильно мучила совесть. Особенно за использование sleep()
Фейспалмная программа на питоне:import RPi.GPIO as GPIO from time import sleep import subprocess import os from random import randint Mfiles = [] path = "/home/pi/Music/" #Папка, где находится музыка files = os.listdir(path) MPFiles = images = filter(lambda x: x.endswith('.mp3'), files); i=0 for mf in MPFiles: MPFiles[i] = path+mf i = i+1 Mfiles = list(MPFiles) Mlen = len(Mfiles) count = 1 CurrentSong = 0 i=0 while i= 10: #если кнопку держат долго,то выходим s = "q" LedState = 0 else: #иначе пауза или воспроизведение if i > 0: player.stdin.write("p") if LedState != 1: LedState = 1 #если воспроизведение, то зажигаем светодиод else: LedState = 2 #иначе моргаем i=0 if GPIO.input(4): #звук выше player.stdin.write("*") if GPIO.input(17): #звук ниже player.stdin.write("/") if GPIO.input(23): #следующая композиция player.stdin.write(">") if LedState == 2: #тут режимы светодиода if lastLed == 1: GPIO.output(24, GPIO.LOW) lastLed = 0 else: GPIO.output(24, GPIO.HIGH) lastLed = 1 else: if LedState == 1: GPIO.output(24, GPIO.HIGH) else: GPIO.output(24, GPIO.LOW) sleep(0.2) #Фэйспалм player.stdin.write("q") # когда выключаемся, то закрываем плеер
Итак. Почти всё готово. Осталось сделать так, чтоб скрипт запускался при старте нашей малинки
- редактируем файл
sudo nano /etc/init.d/StartPlayer
- пишем в редакторе нано это:
#! /bin/sh # /etc/init.d/StartPlayer sudo python /путь_к_питнон_скрипту.py
вместо /путь_к_питнон_скрипту.py напишите путь к вашему питон скриптунажимаем ctrl + xYEnter3)
sudo chmod 755 /etc/init.d/StartPlayer sudo update-rc.d StartPlayer defaults
Всё готово! Загружаем музыку в папку /home/pi/Music/Ставим на вашей SD карточки замок lock, чтобы при случайном выключении питания ничего не сломалось и всё. Плеер готов!!!
P.S. может позже сделаю следующую версию плеера. С нормальным исполнением и программой(без sleep()) и без стороннего плеера
OFFTOPА сейчас я делаю такую милашку ^^
К нему скоро будет камера. Он будет автоматически ездить по квартире. Управление голосом, например «приезжай на кухню». И сам ездить на зарядную станцию.
-
Запись времени захода в комнату или простой пример работы с прерываниями по GPIO на PythonПривет всем! Сейчас я покажу как можно работать с прерываниями на нашем мини-компьютере, то есть выполнять определенное действие в момент смены сигнала на GPIO.
В этом примере будем записывать в файл время открытия и закрытия двери в комнату. Для этого я подцепил герконовый извещатель от охранной сигнализации между выводами +3.3V и GPIO7 (номер может быть любым).
Выглядит это так:
Здесь задействованы только красный и черный провода, которые идут к извещателю, остальные лишние.
Извещатель состоит из двух частей, это магнит и геркон. Геркон вешаем на дверной косяк, а магнит на саму дверь. Когда магнит находится у геркона (дверь закрыта), его цепь замкнута и на GPIO7 поступает единица. Если же открыть дверь или перерезать провод, то она оттуда исчезнет, о чем мы и запишем в файл.
Программная реализация
Для работы с GPIO нашей малинки существует очень удобная библиотека для Python под названием RPIO (http://pythonhosted.org/RPIO/). Рекомендую всем зайти на этот сайт и изучить документацию и примеры, благо объем ее невелик и написана она несложным языком. Итак, для начала собственно установим Python
sudo apt-get install python python-setuptools
И библиотеку RPIO
sudo easy_install -U RPIO
Создадим файл нашего скрипта с названием, к примеру, door.py. Дадим ему права на исполнение:
chmod +rx door.py
Заполним этот файл следующим содержимым:
#!/usr/bin/python # -*- coding: utf-8 -*- import RPIO # Импортируем библиотеку RPIO import time # ...и для работы со временем input_pins = (7,8,9,10) # Задаем номера пинов, которые будут использоваться под ввод. Лучше внести в этот список побольше пинов, дабы избежать наводок. for i in xrange(len(input_pins)): # Включаем их на ввод и подтягиваем к земле RPIO.setup(input_pins[i], RPIO.IN, pull_up_down=RPIO.PUD_DOWN) door = open('/home/pi/door', 'a',0) # Открываем файл в который будем записывать инфу. 'a' означает режиме записи в конец файла 0 - отключить буферизацию, чтбы информация записывалась незамедлительно. def write_door_state(gpio_id, val): # Создаем функцию, запускаемую при изменении состояния GPIO if val==0: door.write (time.strftime("%d.%m.%Y %H:%M:%S")+"\tОткрытие\r\n") #\t - символ табуляции, \r\n - перевод строки else: door.write (time.strftime("%d.%m.%Y %H:%M:%S")+"\tЗакрытие\r\n") RPIO.add_interrupt_callback(7, write_door_state,pull_up_down=RPIO.PUD_DOWN,threaded_callback=True, debounce_timeout_ms=50) #Добавляем прерывание, с подтяжкой к земле и подавлением дребезга контактов RPIO.wait_for_interrupts() # Запускаем ожидание прерываний
Чтобы наш скрипт запускался от имени суперпользователя (а иначе он работать не будет) при старте системы, необходимо в файл /etc/rc.local перед строчкой exit 0 записать путь к нашему скрипту и добавить амперсанд (&) в конце, например
/home/pi/door.py&
Также можно для удобства в файл ~/.bashrc добавить строки
echo "Последние 10 событий двери:" tail door
Теперь при каждом входе в систему будет выводиться последние 10 строк из нашего лога:
Последние 10 событий двери: 26.08.2013 14:24:52 Открытие 26.08.2013 14:25:03 Закрытие 27.08.2013 01:37:57 Открытие
-
Симуляция светофора, или первые шаги в использовании GPIOСобираем на макетной плате и реализуем на "Си" симулятор светофора с кнопкой - простой пример для начала изучения работы с GPIO.
Вместо вступления
В этой записи я хочу рассказать об одном из первых моих проектов, который объясняет основы работы с GPIO выводами Raspberry Pi. Этот проект не является простейшей мигалкой, которую писал, наверное, каждый обладатель Малины, и также не является супер-сложным проектом, который новичку просто не потянуть.Сразу оговорюсь, что идея проекта принадлежит не мне, а одному английскому разработчику - Гордону Хендерсону, который, кстати, написал и библиотеку для Си, которая была использована в проекте. Запись, в принципе, является описанием проекта с моей стороны. Писалась она для новичков, с целью показать основы программирования для работы с GPIO. Теперь, когда все дисклеймеры написаны, приступим к делу.
Идея
Идея заключается в сборке макета (симуляции) светофора с кнопкой, а точнее даже двух светофоров - автомобильного и пешеходного, которые связаны той самой кнопкой. Суть таких светофоров в том, что зеленый свет для пешеходов включается по требованию (читай - по нажатию кнопки). Такой тип светофоров очень распространен в США, где пешеходов в небольших городах довольно мало. Принцип работы таков: Во время простоя автомобилям все время горит зеленый, а пешеходам - красный. По нажатию на кнопку автомобильный светофор останавливает движение, после чего пешеходный светофор зажигает зеленый свет, тем самым разрешая пешеходам перейти улицу. Через некоторое время (не будем его уточнять, это не столь важно) светофоры снова возвращаются в исходное положение: зеленый для машин и красный для пешеходов.
Реализация
Реализацию этого проекта, как и любого другого с использованием GPIO, можно разделить на два этапа: сборка электрической схемы и написание программы, которая будет управлять элементами этой схемы.
Сборка схемы
Для сборки схемы данного проекта нам понадобится:
-
Пластиковая макетная плата. Подойдет любая, я использовал похожую на эту .
-
Светодиоды. Нужно пять штук, два зеленых, два красных и один желтый. Подойдут и любые другие, но для наглядности проекта лучше подобрать именно такие цвета. .
-
Резисторы. Я использовал резисторы в 330 Ом, но можно использовать и большего номинала. Однако не советую использовать номинал выше 1,5 кОм. Резисторов нужно шесть - пять для светодиодов, и один для кнопки.
-
Кнопка. Тут уточнять нечего, кроме того, что она должна быть замыкающей, а не размыкающей.
Также вам понадобится что-то, чтобы соединять нашу макетную плату и выводы GPIO на Малине. Тут уже выбор за вами, скажу лишь что я для этих целей использовал обрезанный IDE шлейф, второй конец которого распаял на 26 DLS-штырьков, который вставляются прямиком в макетку. Как это примерно будет выглядеть в собранном виде и визуальная схема сборки приведена ниже. Советую пользоваться именно графической схемой для сборки.
Обратите внимание на полярность светодиодов. На схеме оранжевым цветом обозначен "+" светодиода (длинная ножка). Многие, должно быть, заметили, что нумерация пинов GPIO выглядит не совсем стандартной. Об этом позднее, а пока, если со сборкой закончили, приступим к следующему шагу.
Пишем программу.
Писать будем на "Си", с использованием библиотеки wiringPi, автором которой является все тот же Гордон Хендерсон. Эта библиотека имеет упрощенный синтаксис и очень схожа с библиотекой для написание скетчей для Arduino. Мне, как новичку, было намного приятнее и удобнее работать с ней, чем со стандартной библиотекой, синтаксис которой читается и воспринимается сложнее. Для начала установим библиотеку. Это сделаем в два шага, выполнять которые нужно в консоли RaspberryPi. Если у Вас уже установлен пакет GIT-core, то первый шаг можно смело пропускать.
Шаг 1: Устанавливаем GIT:
sudo apt-get install git-core sudo apt-get update sudo apt-get upgrade
Шаг 2: Скачиваем и компилируем wiringPi:
git clone git://git.drogon.net/wiringPi cd wiringPi git pull origin ./build
После выполнения этих действий библиотека будет установлена и готова к использованию.Для удобства пользования автор изменил нумерацию пинов GPIO. Распиновку для этой библиотеки вы уже видели выше, на всякий случай ознакомьтесь с "чистой" картинкой распиновки:
Теперь создадим в удобном для вас месте файл walk.c:
touch walk.c
Откроем его:
nano walk.c
И заполним следующим кодом. Этот код и есть кодом для нашей программы, то как он работает я попытался максимально объяснить в комментариях:
//**********Подключаем необходимые библиотеки************ #include "wiringPi.h" //Библиотека для работы с GPIO #include "stdio.h" #include "stdlib.h" //**********Назначаем буквенные метки номерам пинов****** #define RED 0 //Красный автомобильный #define YEL 1 //Желтый автомобильный #define GRE 2 //Зеленый автомобильный #define P_RED 3 //Красный пешеходный #define P_GRE 4 //Зеленый пешеходный #define BUT 8 //Кнопка //------------------------------------------------------- void init() { if (wiringPiSetup () == -1) //Инициализация wiringPi exit (1); //**********Устанавливаем пины светодиодов в режим вывода pinMode (RED, OUTPUT); pinMode (YEL, OUTPUT); pinMode (GRE, OUTPUT); pinMode (P_RED, OUTPUT); pinMode (P_GRE, OUTPUT); //------------------------------------------------------- pinMode (BUT, INPUT); // Пин кнопки ставим в режим ВВОДА //**********Устанавливаем изначальную комбинацию ******** // Функция записи значения имеет следующий синтаксис: // digitalWrite(номер_пина, состояние) //Состояния: LOW - светодиод не горит, HIGH - светодиод горит digitalWrite(RED, LOW); digitalWrite(YEL, LOW); digitalWrite(GRE, HIGH); digitalWrite(P_RED, HIGH); digitalWrite(P_GRE, LOW); //------------------------------------------------------- printf("Okay..\n"); //Выводим в консоль как знак завершения инициализации } //********Функция ожидания нажатия кнопки**************** void button_wait() { printf("Ожидание нажатия...\n"); //Пока состояние кнопки = HIGH (логическая единица) - ждем одну милисекунду while(digitalRead(BUT)==HIGH) { delay(1); } //Как только состояние изменится цикл прервется и в консоль будет выведена надпись printf("Нажато!\n"); } //------------------------------------------------------- //********Функция остановки трафика********************** void stop_traff() { int i; printf("Останавливаем движение...\n"); // Трижды мигаем зеленым светом для автомобилей for(i=0; i<3; i++){ digitalWrite(GRE, LOW); delay(500); digitalWrite(GRE, HIGH); delay(500); } // Выключаем зеленый для автомобилей, включаем желтый digitalWrite(GRE, LOW); digitalWrite(YEL, HIGH); //Ожидаем три секунды, выключаем желтый и включаем красный для автомобилей delay(3000); digitalWrite(YEL, LOW); digitalWrite(RED, HIGH); } //------------------------------------------------------- //********Функция запуска пешеходов********************** void p_start() { //Выключаем пешеходный красный, затем включаем зеленый. Выводим в консоль надпись. digitalWrite(P_RED, LOW); digitalWrite(P_GRE, HIGH); printf("Можно идти!\n"); } //------------------------------------------------------- //********Функция восстановления режимов***************** // Запускается по истечению времени движения пешеходов. void change_time() { printf("Окончание перехода..!\n"); int i; // Выключаем красный для автомобилей и зеленый для пешеходов digitalWrite(RED, LOW); digitalWrite(P_GRE, LOW); //Трижды мигаем одновременно зеленым для пешеходов и желтым for(i=0; i<3; i++){ digitalWrite(P_GRE, HIGH); digitalWrite(YEL, HIGH); delay(500); digitalWrite(P_GRE, LOW); digitalWrite(YEL, LOW); delay(500); } } //------------------------------------------------------- //********Функция запуска автомобилей******************** void start_traff() { printf("Движение автомобилей восстановлено.\n\n"); //Включаем зеленый для автомобилей и красный для пешеходов digitalWrite(GRE, HIGH); digitalWrite(P_RED, HIGH); } //------------------------------------------------------- //*****Главная функция, в которой будут вызваны остальные int main() { printf("__________________Симулятор светофора_________________\n"); init(); for( ; ; ){ //Повторяем бесконечное число раз button_wait(); // Ожидаем нажатие кнопки, код снизу будет выполнен только после нажатия stop_traff(); // Останавливаем автомобили delay(1000); // Ждем секунду, прежде чем запустить пешеходов p_start(); // Запускаем пешеходов delay(5000); //Время для движения пешеходов - 5 секунд change_time(); // Режим восстановления движения start_traff(); // Движение восстановлено } // Чтобы завершить программу нужно нажать Ctrl+C return(0); }
Теперь сохраним наш файл комбинациейCtrl+O и закроем его комбинацией Ctrl+X (комбинации актуальны при использовании текстового редактора nano). Для запуска нашей программы нам нужно её скомпилировать. Делается это следующей командой в консоли:
gcc -Wall -o walk walk.c -lwiringPi
Теперь запускаем:
sudo ./walk
Если вы все сделали правильно - загорится зеленый светодиод на "светофоре" для автомобилей и красный на "светофоре" для пешеходов.По нажатию на кнопку выполнится программа. То, как эта программа работает можно посмотреть на видео - http://youtu.be/R_jUUYhD0BU Если что-то работает неправильно - значит на каком-то из этапов вы допустили ошибку. Проверьте все очень внимательно и попробуйте еще раз.
Заключение.
Собрав и запустив этот проект Вы получили базовые знания в работе с GPIO выводами. Если что-то из проделанного вам показалось сложным или не понятным - пишите об этом в комментарии, с радостью помогу вам разобраться. Надеюсь этот проект не будет вашим последнем, и в следующий раз вы уже соберете что-то свое. Если эта запись будет кому-то полезна, то в будущем я могу написать еще несколько инструкций для новичков. Хорошего дня и удачи в ваших начинаниях
-