Orange Pi Lite

Новая апельсинка

По той причине, что у меня возникли некоторые проблемы с подключением датчиков через i2c, я решил подойти к проблеме немного с другой стороны и приобрёл ещё одну апельсинку, но только уже Pi Lite.

 

Почему захотел новую апельсинку – подкупило то, что у неё есть встроенный hdmi выход, к тому же хотел попробовать запустить i2c на другой машине.

Итак, проблемы с ней начинались вот прям с самого начала):

Питание – для питания используется специальный кабель (разъём) 4*1.7 вроде так, это круглый такой+ пришлось приобретать адаптер + юсб кабель такой.

Дальше, у Lite нет порта для локальной сети. На это внимание я конечно не обратил, когда её приобретал. Для её работы необходим монитор или телевизор) Идём дальше:

Решил купить переходник с HDMI на VGA, т.к. появился для этого подходящий монитор, но!, эта схема вроде работает, если проделать следующие действия:

Пока полностью взято отсюда:

Инструкция

Изменяем файл Script.bin

1. Создаем резервный файл на случай ошибки:

2. Преобразовываем двоичный файла в формат fex редактируемого текста:

3. Редактируем файл fex:

Часть интересующего нас файла находится в разделах [disp_init] и [tv_para] .

В [disp_init]:

Изменяем строку disp_mode:Устанавливает используемые параметры отображения. Может принимать следующие значения от 0 до 4.
0 — соответствует конфигурации экранаscreen0
1 — соответствует конфигурации экранаscreen1
2 — dualhead (screen0, screen1, fb0, fb1) (2 экрана, 2 видео-буфера)
3 — xinerama (screen0, screen1, fb0) (2 экрана, один большой видео-буфер)
4 — clone (screen0, screen1, fb0) (2 экрана, один стандартный видео-буфер)(он показывает то же самое на обоих экранах)

Установим конфигурацию в значение 1, чтобы она отобразила конфигурации экранаscreen1:

Изменяем строчку screen1_output_type, которая устанавливает тип отображения (0 — нет, 1 — LCD, 2 — TV, 3 — HDMI и 4 — VGA ) и screen1_output_mode(0-10 различные разрешения экрана, 11 — выход PAL и 14 — NTSC). Поэтому устанавливаем тип телевизионного экрана с режимом вывода PAL:

В [tv_for]:

Включим ТВ-выход, для этого устанавливаем 1 в tv_used (0 — Off и 1 — On):

Часть файла будет выглядеть следующим образом (остальные строки могут иметь другие значения, это зависит от используемого дистрибутива):

Можно видеть в предыдущей части файла, что screen0 установлен на HDMI с разрешением 720p, но мы выбрали в disp_mode использовать только вывод screen1, поэтому эти параметры пропускаются системой.

Но если никогда не будет использоваться HDMI, то он может быть отключен путем ввода в разделе [hdmi_para] в строчке hdmi_used значение 0.

4. Закрываем файл, сохранив его с таким же именем:

5. Преобразовываем отредактированный файл fex в двоичный формат:

Включаем драйвер ТВ-выхода при запуске системы:

  1. Отредактируем файл загрузочных модулей:

Включаем «tv» в последней строке файла:

2. Закрываем файл, сохранив его с таким же именем:

3. Перезапускаем систему, чтобы изменения вступили в силу:

Попробовав подключить Pi Lite напрямую к телевизору через HDMI, чуда не произошло и ничего не заработало, скорей всего что-то где-то перегорело(

Апдейт!

Приобретя новую orange pi lite (!) , я разобрался, что проблема скорей всего заключается в неправильной установки операционной системы!

У меня возникли сложности при закачке образа на микроСД карту, так вот, в инете пишут, что образ можно записывать из архива, у меня так записать работающий образ не получилось! Образ иногда не находился программой Win32DiskImager, так как я распаковывал только в папку сам образ, без файлов, которые шли в архиве, видимо поэтому образ и не записывался.

Буду тестировать.

 

Продолжаю работу уже с Orange Pi One:

 

Инструкция по настройке выхода hdmi выше представлена для варианта, когда речь идёт о телевизоре, в моём случае (использование кабеля HDMI + VGA to Monitor) я в настройках выбрал использование :

screen1_output_type = 3   (hdmi)
screen1_output_mode = 5
И всё заработало (возможно будет не лишним):
sudo nano /etc/modules
и добавить:
hdmi

Подключение DHT11

Распиновка на Orange Pi One:

 

Подключаем наш датчик, подключили, i2cdetect показал его наличие.

Скачанная программа на C вроде периодически показывает какие-то данные, но пока не очень, пытаюсь похожее запустить на Python  – пока не очень получается.

После того, как я подразобрался с gpio, стало немного понятнее.

DHT11 получилось настроить и запустить, для этого необходимо, чтобы питание было организовано следующим образом:

 

Программа, с помошью которой получаем данные:

 

#include <wiringPi.h> /*библиотека wiringpi без нее работать не будет*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAX_TIMINGS 85
#define DHT_PIN 4 /* IO-4 */
int data[5] = { 0, 0, 0, 0, 0 };
void read_dht_data()
{
uint8_t laststate = HIGH;
uint8_t counter = 0;
uint8_t j = 0, i;
data[0] = data[1] = data[2] = data[3] = data[4] = 0;
pinMode( DHT_PIN, OUTPUT );
digitalWrite( DHT_PIN, LOW );
delay( 18 );
pinMode( DHT_PIN, INPUT );
for ( i = 0; i < MAX_TIMINGS; i++ )
{
counter = 0;
while ( digitalRead( DHT_PIN ) == laststate )
{
counter++;
delayMicroseconds( 1 );
if ( counter == 255 )
{
break;
}
}
laststate = digitalRead( DHT_PIN );
if ( counter == 255 )
break;
if ( (i >= 4) && (i % 2 == 0) )
{
data[j / 8] <<= 1;
if ( counter > 16 )
data[j / 8] |= 1;
j++;
}
}

/*
* check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
* print it out if data is good
*/
if ( (j >= 40) &&
(data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) )
{
float h = (float)((data[0] << 8) + data[1]) / 10;
if ( h > 100 )
{
h = data[0]; // for DHT11
}
float c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10;
if ( c > 125 )
{
c = data[2]; // for DHT11
}
if ( data[2] & 0x80 )
{
c = -c;
}
float f = c * 1.8f + 32;
printf( “Hum= %.1f %% Temp= %.1f *C (%.1f *F)\n”, h, c, f ); /*вывод данных. можно отректировать.*/
}else {
printf( “Data not good, skip\n” );
}
}

int main( void )
{
printf( “Orangepi Pi DHT11/DHT22 temperature/humidity:\n” );

if ( wiringPiSetup() == -1 )
exit( 1 );
read_dht_data();
return(0);
}

 

gcc -pthread -odht dht.c -L/usr/local/lib -lwiringPi – компилируем с использованием библиотеки wiringPi в исполняемый файл “dht”

Если все прошло успешно без ошибок, то запускаем файл и радуемся:

sudo ./dht

 

Так, ну наконец-то что-то прорисовывается!

Датчики, которые я в данные момент использую – я их всех подключаю через didgital output, это раз, у Orange Pi нет встроенного аналогового входа, это два. Итак, что я сделал: через script.bin (как написано выше) я настроил GPIO_para и Gpio_boot (вроде) чтобы у меня было 2 рабочих Gpio порта (в моём случае 25 и ещё какой-то, PA20 и PA02).

Подключая датчик к этому порту (например датчик дождя), я получаю от него сигнал 0 или 1,  что означает идёт дождь или не идёт, есть утечка газа, или нет и т. д.

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

И, скорей всего, после приобретения данного модуля, в бой пойдут уже SPI порты, будем разбираться с ними.

 

Приобрёл данный чип, подключил его следующим образом:

 

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

cd /home/pi

На всякий:

sudo apt-get update
sudo apt-get install python-dev

Устанавливаем библиотеку:

git clone https://github.com/lthiery/SPI-Py
cd SPI-Py
sudo python setup.py install

Дальше пишем программу:

Создаём файл spi_test.py:

#!/usr/bin/python
import spi
import time
import os
 
# Open SPI bus
status = spi.openSPI(speed=1000000)
 
# Function to read SPI data from MCP3008 chip
# Channel must be an integer 0-7
def ReadChannel(channel):
  adc = spi.transfer((1,(8+channel)<<4,0))
  data = ((adc[1]&3) << 8) + adc[2]
  return data
 
# Function to convert data to voltage level,
# rounded to specified number of decimal places.
def ConvertVolts(data,places):
  volts = (data * 3.3) / float(1023)
  volts = round(volts,places)
  return volts
 
# Function to calculate temperature from
# TMP36 data, rounded to specified
# number of decimal places.
def ConvertTemp(data,places):
 
  # ADC Value
  # (approx)  Temp  Volts
  #    0      -50    0.00
  #   78      -25    0.25
  #  155        0    0.50
  #  233       25    0.75
  #  310       50    1.00
  #  465      100    1.50
  #  775      200    2.50
  # 1023      280    3.30
 
  temp = ((data * 330)/float(1023))-50
  temp = round(temp,places)
  return temp
 
# Define sensor channels
light_channel = 0
temp_channel  = 1
 
# Define delay between readings
delay = 5
 
while True:
 
  # Read the light sensor data
  light_level = ReadChannel(light_channel)
  light_volts = ConvertVolts(light_level,2)
 
  # Read the temperature sensor data
  temp_level = ReadChannel(temp_channel)
  temp_volts = ConvertVolts(temp_level,2)
  temp       = ConvertTemp(temp_level,2)
 
  # Print out results
  print "--------------------------------------------"
  print("Light: {} ({}V)".format(light_level,light_volts))
  print("Temp : {} ({}V) {} deg C".format(temp_level,temp_volts,temp))
 
  # Wait before repeating loop
  time.sleep(delay)

Для запуска:

sudo python spi_test.py

Как мы видим, данная программа написана для совсем другого датчика, но самое главное, что процесс пошёл и показания с аналогового датчика поступают!

Подключил ещё датчик MQ2, тоже начал реагировать на наличие газа и показывать данные.

Итого сейчас подключены датчики температуры, влажности, осадков, газов, освещенности, скорей всего попытаюсь ещё подключить каких-нибудь дополнительных датчиков, например барометр, если получится. Но возникла следующая ситуация – в одну программу я всё запихнуть не смогу, т.к. температурный датчик и влажности работает на цифре, а все остальные на аналоге, поэтому скорей всего показания температуры и влажности будут сохраняться в файле, откуда будут забираться Python’ом и отправляться вместе с остальными показаниями на сервер в базу данных.

 

Барометр BMP180

Настало время подключить барометр, я буду использовать bmp180, вот как он подключается к Orange Pi One (сейчас работаю с Pi One):

Подключаем его, проверяем его, что он подключился:

ic2detect -y 0

i2cdetect -y 1

По идее, он должен определиться по адресу 0х77 .

Дальше можно командой

dmesg | grep bmp

Посмотреть, что с ним всё хорошо:

Так, важное дополнение:

Необходимо также дописать две строчки в один файл :

nano /etc/modprobe.d/fbdev-blacklist.conf

blacklist pcf8591
blacklist bmp085

reboot

aptitude install i2c-tools libi2c-dev

После этого адрес барометра будет отображаться под номер 77, а не UU, как сейчас у меня на скриншоте,

После всех попыток, нашёл рабочую программу на Python :

wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/bmp180.py
python bmp180.py

Возможно в файле придётся изменить адрес устройства и номер шины, а так всё вроде настроено.
Данная программа выводит показания температуры и давления, сделано.

Добавим и эти данные к данным, которые мы отправляем в базу данных)

Сделано, также я добавил в crontab, чтобы запускались эти программы, необходимо учесть,
что в crontab -e необходимо указывать полный путь до файла, иначе результаты сохранятся не будут!
Please follow and like us:
0
Orange Pi Lite

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Перейти к верхней панели