ITСooky

IT-рецепты съедобные и не очень!

Обзор-тестирование Orange Pi PC в качестве Raspberry Pi

дата 16.11.2015

На Orange Pi PC можно установить образ Raspbian, есть на сайте апельсинов, но это ничего не даст — будет выглядеть один в один, но много нужного не будет работать — потому что не малинка вообще никак — да и проблема с включением модулей в ядре тоже по этой причине!

orangepipc_raspberrypi_010

Так что будем ставить образ вот от этого чувака, loboris еще раз фенкс, тем более обещает, что все нам нужное включено в ядре — GPIO, i2c (TWI), SPI enabled

Эту статью можно считать продолжением вот этой http://www.itcooky.com/?p=3925
itcooky_orangepipc_001

Качаем OrangePI-PC_Ubuntu_Vivid_Mate.img
Далее, все просто, если у вас например Ubuntu (да пусть у вас будет Ubuntu) вставляете карту памяти форматируете её в ноль например Gparted.
Далее заливаете имадж (предварительно его разархивировав конечно же).
sdd — это карта памяти, у вас может быть другая, осторожней с этим.
в папке с имаджем запускаем команду
sudo dd if=OrangePI-PC_Ubuntu_Vivid_Mate.img of=/dev/sdd bs=1M oflag=direct
После первой загрузки надо выполнить
sudo fs_resize
sudo rm /usr/local/bin/fs_resize_warning

Выбираем свой часовой пояс
sudo timedatectl set-timezone Europe/Moscow
посмотреть из чего можно выбрать
timedatectl list-timezones
И после каждого ребута ставим время(очень важно)(пока часы не прикрутили)
месяцденьчасминутагодточкасекунды
date 101219152015.33

Исправляем ошибку по которой не резолвитца хост OrangePI
прописываем в
vi /etc/hostname
текст

Opelsinka

а в
vi /etc/hosts
текст

127.0.0.1       Opelsinka
::1             Opelsinka ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

В файле
vi /etc/network/interfaces
оставлем только текст

allow-hotplug eth0
iface eth0 inet dhcp

Подключение жк-дисплея к Orange Pi PC
Покупал вот это Особое! Жк-дисплей модуль синий экран IIC / I2C 1602 жк-дисплей за 196.56 RUR.

orangepipc_raspberrypi_002orangepipc_raspberrypi_003

Брал две штуки — одна нормальная, вторая криво припаяна. На плате YwRobot есть синий регулятор контраста (как мне кажется) регулирует фигово буквы проявляются(именно так это выглядит) только в крайнем положение. Есть джампер для включения голубой подсветки — непонятно за чем он, потому что без подсветки на этом экране ничего не видно!!! Подсветка неровная пятнами.

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

Подключаем как есть, одно к другому
lscd_bb

Я уже говорил что инструкции от Raspberry Pi подходят, вот берем эту инструкцию http://devram0.blogspot.ru/2014/09/raspberry-pi-ywrobot-arduino-lcm1602.html

Обновим репозиторию и установим git
sudo apt-get update && sudo apt-get install git-core
иии…
sudo apt-get make
sudo apt-get gcc
sudo apt-get vim
cd /root
sudo git clone https://github.com/wargio/liblcm1602.git
cd liblcm1602
make

Хотя make еще рано делать

Смотрим где у нас в i2c висит жк
sudo i2cdetect -y 1
пусто
sudo i2cdetect -y 0
есть
orangepipc_raspberrypi_004
открываем все файлы с расширением .c
vi example2.c
и меняем в строке

i2c_dev = open_i2c(I2C_FILE_NAME, 0x3f);

0x27 на 0x3f

самый нужный нам скрипт example2 выглядеть вот так

#include <stdio.h>
#include <string.h>
#include "i2c.h"
#include "lcd.h"

#define I2C_FILE_NAME                "/dev/i2c-0"
int main(int argc, char **argv){
    int i2c_dev, i;
    lcd lcd0;
    i2c_dev = open_i2c(I2C_FILE_NAME, 0x3f);
    if(i2c_dev <0){
       printf("Errore: %d\n", i2c_dev);
       return 1;
    }
    lcd_init(&lcd0, i2c_dev);//, 16);
    lcd_clear(&lcd0);
    for(i=1; i<3 && i<argc; ++i)
        lcd_print(&lcd0, argv[i], strlen(argv[i]), i-1);

    close_i2c(i2c_dev);
    return 0;
}

делаем
make
и пробуем
./example2 "First STR" "Second STR"
orangepipc_raspberrypi_005

Теперь будем показывать на экране время(не очень нужно) и наш локальный IP (очень нужно если использовать без монитора HDMI и получать IP по DHCP)

Делаем скрипт
vi timeip.sh
вставляем туда строки

#!/usr/local/bin/bash
t=`/bin/date +%Y"."%m"."%d"-"%H":"%M`
ip=`/sbin/ifconfig|/bin/grep inet|/usr/bin/head -1|/bin/sed 's/\:/ /'|/usr/bin/awk '{print $3}'`
/root/liblcm1602/example2 ${t} ${ip}

делаем его исполняемым
chmod +x timeip.sh
Надо помнить что длина строки на экране 16 символов, как раз хватает на IP
Ставим запускать по рассписанию
crontab -e
каждую минуту

*/1 * * * * /bin/sh /root/timeip.sh

orangepipc_raspberrypi_001

Вот так это пока выглядит внутри
orangepipc_raspberrypi_008

Моргание лампочкой
Классика — первым делом надо поморгать! Тут очень кстати появился работающий способ вот по это ссылке https://github.com/zhaolei/WiringOP

sudo git clone http://github.com/zhaolei/WiringOP.git -b h3

Если ругается на сертификат выставите правильное время


cd WiringOP
chmod +x ./build
sudo ./build

запустим и посмотрим
gpio readall
orangepipc_raspberrypi_006
Вот где IO это рабочии выводы — и они идут не по порядку (и не все работают)
и попробуем что-то запустить

подключаем по схемке
led_opp

cd examples
vi blink.c

доводим до такого вида

#include <stdio.h>
#include <wiringPi.h>

// LED Pin - wiringPi pin 0 is BCM_GPIO 17.

#define LED     1

int main (void)
{
  printf ("Raspberry Pi blink\n") ;

  wiringPiSetup () ;
  pinMode (LED, OUTPUT) ;

  for (;;)
  {
    digitalWrite (LED, HIGH) ;  // On
    delay (500) ;               // mS
    digitalWrite (LED, LOW) ;   // Off
    delay (500) ;
  }
  return 0 ;
}

главне чтобы #define LED был 1, потому что 0 не работает

делаем
make blink
и запускаем — будем моргать пока не остановим, причем лампочка останется в прерваном состоянии
./blink

orangepipc_raspberrypi_007

Подключаем часы реального времени DS3231 RTC
Это должно было быть самым простым и понятным подключением… если бы часы работали, и инструкции из интернета тоже!!!

Брал вот эти часики AT24C32 IIC модуль точность часов реального времени модуль памяти ( с нашими battary ) никаких батарей к ниему не прилагается — подходят 2032 и 2025 (другие не пробовал)

orangepipc_raspberrypi_009

В интернете встречаются инструкци где советуют пару резисторов сразу отодрать http://www.raspberrypi-spy.co.uk/2015/05/adding-a-ds3231-real-time-clock-to-the-raspberry-pi/ отдрал я один — нет — ни на что не повлияло!!!

SDA SCL оказались такими портами к которым можно подключать куча всего паралельно к одному усику. Вот схема, часы питаются от 5V:
lscd_rtc_bb

Начну сразу с конца
добавляем строки в
vi /etc/rc.local
вот эти перед exit 0

sudo echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device
sudo hwclock -s -f /dev/rtc1

Ребутимся и все сразу работает! Теперь подробно:

Почему 0x68
потому что комманда
sudo i2cdetect -y 0
показывает что он там

sudo: unable to resolve host OrangePI
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3f 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --   

Почему i2c-0
Потому же почему и предыдущий ответ

Почему sudo hwclock -s -f /dev/rtc1
А вот это интересно. На Orante Pi Pc уже есть часы реального времени sunxi-rtc, вот они виднеются
dmesg | grep rtc
вот

[    3.704954] sunxi-rtc sunxi-rtc: rtc core: registered sunxi-rtc as rtc0
[    4.494669] sunxi-rtc sunxi-rtc: setting system clock to 1970-01-01 00:00:10 UTC (10)
[   21.429859] rtc-ds1307 0-0068: rtc core: registered ds1307 as rtc1
[   21.429883] rtc-ds1307 0-0068: 56 bytes nvram

И они не работают(не считают время, сбрасывают после повер оф), и они rtc0, и hwclock как его не ковыряй тупо регаирует на них. А наши часики на rtc1

Поэтому команду установить системное время мы делаем указав у кого это время брать
sudo hwclock -s -f /dev/rtc1

Команда посмотреть время
sudo hwclock -r -f /dev/rtc1

Команда записать в часы системное время
sudo hwclock -w -f /dev/rtc1

Подключаем датчик температуры и влажности DHT22 или DHT11
Тут я понял, что все инструкции написанные для Рмалинки на python, не работают на Опельсинке! А вот на си плюс да! Хотелось бы его конечно знать, но…

Беру с этого сайта код http://www.uugear.com/portfolio/read-dht1122-temperature-humidity-sensor-from-raspberry-pi/ и вставляем его, сначала делая папку

mkdir /root/DHT
cd /root/DHT
vi dht.c

текст

/*
 *  dht.c:
 *	read temperature and humidity from DHT11 or DHT22 sensor
 */
 
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
 
#define MAX_TIMINGS	85
#define DHT_PIN		4	/* GPIO-22 */
 
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;
 
	/* pull pin down for 18 milliseconds */
	pinMode( DHT_PIN, OUTPUT );
	digitalWrite( DHT_PIN, LOW );
	delay( 18 );
 
	/* prepare to read the pin */
	pinMode( DHT_PIN, INPUT );
 
	/* detect change and read data */
	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;
 
		/* ignore first 3 transitions */
		if ( (i >= 4) && (i % 2 == 0) )
		{
			/* shove each bit into the storage bytes */
			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( "Humidity = %.1f %% Temperature = %.1f *C (%.1f *F)\n", h, c, f );
	}else  {
		printf( "Data not good, skip\n" );
	}
}
 
int main( void )
{
	printf( "Raspberry Pi DHT11/DHT22 temperature/humidity test\n" );
 
	if ( wiringPiSetup() == -1 )
		exit( 1 );
 
	while ( 1 )
	{
		read_dht_data();
		delay( 2000 ); /* wait 2 seconds before next read */
	}
 
	return(0);
}

И собираем, с командой как на сайте не соберется, а вот с этой соберется
gcc -pthread -odht dht.c -L/usr/local/lib -lwiringPi
и запускам
sudo ./dht
работает каналья

sudo: unable to resolve host OrangePI
Raspberry Pi DHT11/DHT22 temperature/humidity test
Data not good, skip
Humidity = 33.0 % Temperature = 24.0 *C (75.2 *F)
Humidity = 33.0 % Temperature = 24.0 *C (75.2 *F)
Data not good, skip
Data not good, skip
Humidity = 33.0 % Temperature = 24.0 *C (75.2 *F)
Humidity = 33.0 % Temperature = 24.0 *C (75.2 *F)
Data not good, skip
Humidity = 33.0 % Temperature = 24.0 *C (75.2 *F)
Humidity = 33.0 % Temperature = 24.0 *C (75.2 *F)
Data not good, skip
Humidity = 33.0 % Temperature = 24.0 *C (75.2 *F)
Humidity = 33.0 % Temperature = 24.0 *C (75.2 *F)
Data not good, skip
Humidity = 33.0 % Temperature = 24.0 *C (75.2 *F)
Humidity = 33.0 % Temperature = 24.0 *C (75.2 *F)
Data not good, skip
Data not good, skip

Схема подключения: использовал 5V и 4-тый GPIO, — вот все вместе
lscd_rtc_dht_dht

Программа Fritzing — бесплатная программа для рисоваия электронных схем — конечно невероятное ГАВНО. Ни с одной заявленной функцией оно не справляется. Если с частями, которые уже есть в программе, можно что-то нарисовать, то добавить своих и сделать что-то просто невозможно. Как мне удалось эскиз Orange Pi Pc туда добавить — непонимаю!!!

Что бы уместить всё в корпус надо перерисовать всю схемку и уместить всё на двух макетках 5 на 11, но — смотри комментарий выше — да ладно без схемки и так понятно! Тут главное взять надо нано хлебныедоски (а, что? а вы их как называете?). Брал вот эти http://ru.aliexpress.com/item/7PCS-Mini-55-Tie-point-Breadboard-Solderless-Prototype-Test-Board/32382692429.html

orangepipc_raspberrypi_011

И вот так все выглядит в самодельном корпусе за 35 рублей — скромненько, практично!
orangepipc_raspberrypi_012

UPD: Чтобы обозначенная конфигурация, или даже компоновка, обрела законченный смысл сделаем так чтобы следующее работало так — на экран выводится время и IP, через 30 скунд показывает температура и влажность, при обновлении экрана мигает лампочка.

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

Создаем скрипт
cd ./DHT
vi dht2.c

Вставляем туда, зедсь все также как на верху только лишнее убрато

/*
 *  dht.c:
 *      read temperature and humidity from DHT11 or DHT22 sensor
 */
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define MAX_TIMINGS 85  
#define DHT_PIN 4               /* GPIO-22 */

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;

        /* pull pin down for 18 milliseconds */
        pinMode( DHT_PIN, OUTPUT );
        digitalWrite( DHT_PIN, LOW );
        delay( 18 );

        /* prepare to read the pin */
        pinMode( DHT_PIN, INPUT );

        /* detect change and read data */
        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;

                /* ignore first 3 transitions */
                if ( (i >= 4) && (i % 2 == 0) )
                {
                        /* shove each bit into the storage bytes */
                        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( "%.1f %.1f\n", h, c);

exit(1);

        }else  {
/*              printf( "Data not good, skip\n" );
*/
        }
}

int main( void )
{
/*      printf( "Raspberry Pi DHT11/DHT22 temperature/humidity test\n" );
*/
        if ( wiringPiSetup() == -1 )
                exit( 1 );

        while ( 1 )
        {
                read_dht_data();
                delay( 20 ); /* wait 2 seconds before next read */
        }

        return(0);
}

компилируем
gcc -pthread -odht dht.c -L/usr/local/lib -lwiringPi
проверяем
./dht2
нормуль

21.0 33.0

Теперь снимаем данные и пишим в лог файл
cd /root
vi htmon.sh

вставляем код

#!/usr/local/bin/bash
d=`/root/DHT/dht2`
t=`/bin/date +%Y"."%m"."%d"-"%H":"%M" "`
/bin/echo ${t}${d} >> /var/log/mon.log

делаем
chmod +x htmon.sh
будем запускать раз в минуту
crontab -e
вставляем

*/1 * * * * /root/htmon.sh

также меняем скрипт моргания
cd /root/WiringOP/examples
vi blink.c

доводим до вида

#include <stdio.h>
#include <wiringPi.h>

// LED Pin - wiringPi pin 0 is BCM_GPIO 17.

#define LED 1   

int main (void)
{
//  printf ("Raspberry Pi blink\n") ;

  wiringPiSetup () ;
  pinMode (LED, OUTPUT) ;

//  for (;;)
//  {
    digitalWrite (LED, HIGH) ;  // On
    delay (200) ;               // mS
    digitalWrite (LED, LOW) ;   // Off
//    delay (500) ;
//  }
 return 0 ;
}

собираем
make blink
Радактируем основной скрипт который уже запускает раз в минуту
vi /root/timeip.sh
и доводим его до вида

#!/usr/local/bin/bash
t=`/bin/date +%Y"."%m"."%d"-"%H":"%M`
ip=`/sbin/ifconfig|/bin/grep inet|/usr/bin/head -1|/bin/sed 's/\:/ /'|/usr/bin/awk '{print $3}'`
/root/WiringOP/examples/blink
/root/liblcm1602/example2 ${t} ${ip}
sleep 30
h=`/root/DHT/dht2 | /usr/bin/awk '{print $1}'`
th=`/root/DHT/dht2 | /usr/bin/awk '{print $2}'`
/root/WiringOP/examples/blink
/root/liblcm1602/example2 "${t}" "H:${h}% T:${th}C"

всё

UPD: Подключаем Wi-Fi USB
Кто-то сказал что RTL 8188EUS работает — сразу прикупил вот этот Мини USB адаптер wi-fi RTL 8188EUS Comfast CF-WU810N-1 adaptador беспроводная точка доступа wi-fi USB WiFi ключ adaptador WiFi USB вроде как у производителя… Дошло быстро в конверте, обычно такие коныверты даже не приходится додоставлять от «Почты России» до дома — сразу кидают в почтовый ящик (но мне пришлось сходить!)
orangepipc_raspberrypi_013
Подключается простым вставлениям в USB
orangepipc_raspberrypi_014

Посмотреть подклюбчился ли он можно командой
lsusb
вот он под нумером 3

Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 003: ID 0bda:8179 Realtek Semiconductor Corp. 
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Как мне показалось в этом образе есть все нужное уже

Комманда показать модули
lsmod
должна показать

Module                  Size  Used by
8188eu                901509  0

устанавливаем нудные утилиты
sudo apt-get install wireless-tools
работают команды
iwconfig
и показать окрестные сети
iwlist wlan1 scan
но этой утилиты мало для подключения к WEP2 — то есть она только может к WEP
вот так
sudo iwconfig wlan1 essid Nameseti key s:parolbukwami

Ставим если не стоит вот это
sudo apt-get install wpasupplicant

Записываем пароль и имя к сети к которой собираем подключаться особым образом
wpa_passphrase MYWIFINAME mypassword > /etc/wpa2.conf

в файле получаем такой текст

network={
            ssid="ssid_name"
#psk="password"
            psk=39fg94hg943hg94h5g9h34gh43hg429hgerhg
}

редактируем чтобы текст был таким

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
            ssid="ssid_name"
#psk="password"
            psk=39fg94hg943hg94h5g9h34gh43hg429hgerh
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
group=CCMP
auth_alg=OPEN
}

RSN — потому что WEP2 у меня сеть
CCMP — потому что AES у меня шифрование сети

Чтобы подключалось автоматом добавляю в файл
vi /etc/network/interfaces
текст

allow-hotplug wlan1
iface wlan1 inet dhcp
wpa-conf /etc/wpa2.conf
iface default inet dhcp

Перегружаемся и все рабоатет

Теоретически можно подключаться с консоли (я на это убил часа 3 — а надо было всего лишь перегрузиться)
коммандой которая уйдет в фоновый режим
sudo wpa_supplicant -Dwired -B -iwlan1 -c/etc/wpa2.conf
или с полным дебагом
sudo wpa_supplicant -Dwired -dd -iwlan1 -c/etc/wpa2.conf
да тут надо еще угать с драйевром в -D