Search

Banana Pi - BPI-M2+ / i2c 통신, pi4j, PCA9685

OS/Banana Pi 2017.03.12 16:11 Posted by 파란크리스마스

detect I2C chips

출처 : i2cdetect(8): detect I2C chips - Linux man page

$ ls /dev/*i2c*
/dev/i2c-0  /dev/i2c-1
$ i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: 70 -- -- -- -- -- -- --  

PCA9685 제어

import java.io.IOException;
import java.math.BigDecimal;

import com.pi4j.gpio.extension.pca.PCA9685GpioProvider;
import com.pi4j.gpio.extension.pca.PCA9685Pin;
import com.pi4j.io.gpio.BPIM2PGpioProvider;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinPwmOutput;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.i2c.I2CBus;
import com.pi4j.io.i2c.I2CFactory;
import com.pi4j.io.i2c.I2CFactory.UnsupportedBusNumberException;

public class PCA9685Gpio {
	
	public static final int SERVO_DURATION_MIN = 650;
	public static final int SERVO_DURATION_NEUTRAL = 1500;
	public static final int SERVO_DURATION_MAX = 2100;
	
	private static PCA9685Gpio instance = null;
	
	private PCA9685GpioProvider gpioProvider = null;
	
	// sudo java -cp .:pi4j-core.jar:pi4j-gpio-extension.jar PCA9685Gpio
	
	private PCA9685Gpio() throws IOException, UnsupportedBusNumberException {		
		
		GpioFactory.setDefaultProvider(new BPIM2PGpioProvider());
		
		System.out.println("<--Pi4J--> PCA9685 PWM Example ... started.");
		// This would theoretically lead into a resolution of 5 microseconds per
		// step:
		// 4096 Steps (12 Bit)
		// T = 4096 * 0.000005s = 0.02048s
		// f = 1 / T = 48.828125
		BigDecimal frequency = new BigDecimal("48.828");
		// Correction factor: actualFreq / targetFreq
		// e.g. measured actual frequency is: 51.69 Hz
		// Calculate correction factor: 51.65 / 48.828 = 1.0578
		// --> To measure actual frequency set frequency without correction
		// factor(or set to 1)
		BigDecimal frequencyCorrectionFactor = new BigDecimal("1.0578");
		// Create custom PCA9685 GPIO provider
		I2CBus bus = I2CFactory.getInstance(I2CBus.BUS_0);
		gpioProvider = new PCA9685GpioProvider(bus, 0x40, frequency, frequencyCorrectionFactor);
		// Define outputs in use for this example
		GpioPinPwmOutput[] myOutputs = provisionPwmOutputs(gpioProvider);
		// Reset outputs
		gpioProvider.reset();
	}
	
	public static PCA9685Gpio getInstance() throws IOException, UnsupportedBusNumberException {
		if (instance==null) instance = new PCA9685Gpio();
		return instance;
	}
	
	public void setPwm(Pin pin, int duration) {
		gpioProvider.setPwm(pin, duration);
	}
	
	public void shutdown() {
		gpioProvider.shutdown();
	}
	
	private static GpioPinPwmOutput[] provisionPwmOutputs(final PCA9685GpioProvider gpioProvider) {
		GpioController gpio = GpioFactory.getInstance();
		GpioPinPwmOutput myOutputs[] = { 
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_00, "Pulse 00"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_01, "Pulse 01"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_02, "Pulse 02"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_03, "Pulse 03"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_04, "Pulse 04"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_05, "Pulse 05"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_06, "Pulse 06"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_07, "Pulse 07"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_08, "Pulse 08"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_09, "Pulse 09"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_10, "Always ON"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_11, "Always OFF"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_12, "Servo pulse MIN"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_13, "Servo pulse NEUTRAL"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_14, "Servo pulse MAX"),
				gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_15, "not used") };
		return myOutputs;
	}

	public static void main(String[] args) throws Exception {
		
		PCA9685Gpio test = PCA9685Gpio.getInstance();
		
		test.setPwm(PCA9685Pin.PWM_01, SERVO_DURATION_NEUTRAL);
		Thread.sleep(200);
		
		for (int i=SERVO_DURATION_MIN; i<=SERVO_DURATION_MAX; i+=30) {
			test.setPwm(PCA9685Pin.PWM_00, i);
			Thread.sleep(200);
		}
		
		for (int i=SERVO_DURATION_MAX; i>=(int)(SERVO_DURATION_MIN+(SERVO_DURATION_MAX-SERVO_DURATION_MIN)/2); i-=30) {
			test.setPwm(PCA9685Pin.PWM_00, i);
			Thread.sleep(200);
		}
				
		for (int i=SERVO_DURATION_MIN; i<=SERVO_DURATION_MAX; i+=30) {
			test.setPwm(PCA9685Pin.PWM_01, i);
			Thread.sleep(200);
		}
		
		for (int i=SERVO_DURATION_MAX-200; i>=(int)(SERVO_DURATION_MIN+(SERVO_DURATION_MAX-SERVO_DURATION_MIN)/2); i-=30) {
			test.setPwm(PCA9685Pin.PWM_01, i);
			Thread.sleep(200);
		}
		
		test.shutdown();

	}
	
}

실행

$ sudo java -cp .:pi4j-core.jar:pi4j-gpio-extension.jar PCA9685Gpio
platformId = raspberrypi / label = Raspberry Pi
platformId = bananapi / label = BananaPi
platformId = bananapro / label = BananaPro
platformId = odroid / label = Odroid
platformId = BPI_M2P / label = BPI_M2P
piboardRev: Hardware string: Hardware   : sun8i
Hardware:Hardware       : sun8i
piboardRev:  3
piboardId: Revision string: Revision    : 0000
wiringPi: wiringPiSetup called
piboardRev: Hardware string: Hardware   : sun8i
Hardware:Hardware       : sun8i
piboardRev:  3
piboardRev: Hardware string: Hardware   : sun8i
Hardware:Hardware       : sun8i
piboardRev:  3
piboardId: Revision string: Revision    : 0000
wiringPiSetup: wiringPiMode = 0
<--Pi4J--> PCA9685 PWM Example ... started.

실행 결과

저작자 표시
신고

Banana Pi - BPI-M2+ pi4j

OS/Banana Pi 2017.03.12 14:52 Posted by 파란크리스마스

BPI-M2+ pi4j

출처 : The Pi4J Project - Home

현재 pi4j는 BPI-M2+ 지원하지 않아 수정한 jar를 배포합니다.

pi4j-core.jar

GPIO를 이용하여 LED 제어

/*
 * #%L
 * **********************************************************************
 * ORGANIZATION  :  Pi4J
 * PROJECT       :  Pi4J :: Java Examples
 * FILENAME      :  ControlGpioExample.java
 *
 * This file is part of the Pi4J project. More information about
 * this project can be found here:  http://www.pi4j.com/
 * **********************************************************************
 * %%
 * Copyright (C) 2012 - 2016 Pi4J
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Lesser Public License for more details.
 *
 * You should have received a copy of the GNU General Lesser Public
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/lgpl-3.0.html>.
 * #L%
 */
 
import com.pi4j.io.gpio.BPIM2PGpioProvider;
import com.pi4j.io.gpio.BPIM2PPin;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
 
/**
 * This example code demonstrates how to perform simple state
 * control of a GPIO pin on the Raspberry Pi.
 *
 * @author Robert Savage
 */
public class ControlGpioExample {
 
    public static void main(String[] args) throws InterruptedException {

        GpioFactory.setDefaultProvider(new BPIM2PGpioProvider());

        System.out.println("<--Pi4J--> GPIO Control Example ... started.");
 
        // create gpio controller
        final GpioController gpio = GpioFactory.getInstance();
 
        // provision gpio pin #01 as an output pin and turn on
        final GpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin(BPIM2PPin.GPIO_00, "MyLED", PinState.HIGH);
 
        // set shutdown state for this pin
        pin.setShutdownOptions(true, PinState.LOW);
 
        System.out.println("--> GPIO state should be: ON");
 
        Thread.sleep(5000);
 
        // turn off gpio pin #01
        pin.low();
        System.out.println("--> GPIO state should be: OFF");
 
        Thread.sleep(5000);
 
        // toggle the current state of gpio pin #01 (should turn on)
        pin.toggle();
        System.out.println("--> GPIO state should be: ON");
 
        Thread.sleep(5000);
 
        // toggle the current state of gpio pin #01  (should turn off)
        pin.toggle();
        System.out.println("--> GPIO state should be: OFF");
 
        Thread.sleep(5000);
 
        // turn on gpio pin #01 for 1 second and then off
        System.out.println("--> GPIO state should be: ON for only 1 second");
        pin.pulse(1000, true); // set second argument to 'true' use a blocking call
 
        // stop all GPIO activity/threads by shutting down the GPIO controller
        // (this method will forcefully shutdown all GPIO monitoring threads and scheduled tasks)
        gpio.shutdown();
 
        System.out.println("Exiting ControlGpioExample");
    }
}

실행

$ sudo java -cp .:pi4j-core.jar:pi4j-gpio-extension.jar ControlGpioExample
platformId = raspberrypi / label = Raspberry Pi
platformId = bananapi / label = BananaPi
platformId = bananapro / label = BananaPro
platformId = odroid / label = Odroid
platformId = BPI_M2P / label = BPI_M2P
piboardRev: Hardware string: Hardware   : sun8i
Hardware:Hardware       : sun8i
piboardRev:  3
piboardId: Revision string: Revision    : 0000
wiringPi: wiringPiSetup called
piboardRev: Hardware string: Hardware   : sun8i
Hardware:Hardware       : sun8i
piboardRev:  3
piboardRev: Hardware string: Hardware   : sun8i
Hardware:Hardware       : sun8i
piboardRev:  3
piboardId: Revision string: Revision    : 0000
wiringPiSetup: wiringPiMode = 0
<--Pi4J--> GPIO Control Example ... started.
pinMode,2272,pin:1,mode:1
func:sunxi_set_pin_mode pin:1, MODE:1 bank:0 index:1 phyaddr:0x1c20800
read reg val: 0x77222212 offset:4
Out mode ready set val: 0x77222212
Out mode set over reg val: 0x77222212
func:sunxi_digitalWrite pin:1, value:1 bank:0 index:1 phyaddr:0x1c20810
befor write reg val: 0x8002,index:1
HIGH val set over reg val: 0x8002
--> GPIO state should be: ON
func:sunxi_digitalWrite pin:1, value:0 bank:0 index:1 phyaddr:0x1c20810
befor write reg val: 0x8002,index:1
LOW val set over reg val: 0x8000
--> GPIO state should be: OFF
func:sunxi_digitalRead pin:1,bank:0 index:1 phyaddr:0x1c20810
***** read reg val: 0x0,bank:0,index:1,line:1389
func:sunxi_digitalWrite pin:1, value:1 bank:0 index:1 phyaddr:0x1c20810
befor write reg val: 0x8000,index:1
HIGH val set over reg val: 0x8002
--> GPIO state should be: ON
func:sunxi_digitalRead pin:1,bank:0 index:1 phyaddr:0x1c20810
***** read reg val: 0x1,bank:0,index:1,line:1389
func:sunxi_digitalWrite pin:1, value:0 bank:0 index:1 phyaddr:0x1c20810
befor write reg val: 0x8002,index:1
LOW val set over reg val: 0x8000
--> GPIO state should be: OFF
--> GPIO state should be: ON for only 1 second
func:sunxi_digitalWrite pin:1, value:1 bank:0 index:1 phyaddr:0x1c20810
befor write reg val: 0x8000,index:1
HIGH val set over reg val: 0x8002
func:sunxi_digitalWrite pin:1, value:0 bank:0 index:1 phyaddr:0x1c20810
befor write reg val: 0x8002,index:1
LOW val set over reg val: 0x8000
func:sunxi_digitalWrite pin:1, value:0 bank:0 index:1 phyaddr:0x1c20810
befor write reg val: 0x8000,index:1
LOW val set over reg val: 0x8000
Exiting ControlGpioExample

실행 결과

저작자 표시
신고

Banana Pi - BPI-M2+

OS/Banana Pi 2017.02.26 22:23 Posted by 파란크리스마스

Banana PI - BPI-M2+

출처 : BPI-M2+
【BPI-M2+】之mjpg-streamer测试和体验- Bananap讨论区- 烽火社区 ...
http://forum.banana-pi.org/c/Banana-pi-BPI-M2

SD 확장

SD 확장전 용량확인

$ df -l
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root        7156088 4680932   2111636  69% /
devtmpfs          380800       0    380800   0% /dev
tmpfs             512036     800    511236   1% /dev/shm
tmpfs             512036   20248    491788   4% /run
tmpfs               5120       4      5116   1% /run/lock
tmpfs             512036       0    512036   0% /sys/fs/cgroup
/dev/mmcblk0p1    261868  213188     48680  82% /boot
tmpfs             102408      36    102372   1% /run/user/1000

SD FDisk

pi@bpi-iot-ros-ai:~$ sudo fdisk /dev/mmcblk0

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/mmcblk0: 14.7 GiB, 15811477504 bytes, 30881792 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0006c94a

Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1 *    204800   729087   524288  256M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      729088 15269887 14540800    7G 83 Linux

Command (m for help): d
Partition number (1,2, default 2): 2

Partition 2 has been deleted.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (2048-30881791, default 2048): 729088
Last sector, +sectors or +size{K,M,G,T,P} (729088-30881791, default 30881791): 

Created a new partition 2 of type 'Linux' and of size 14.4 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

pi@bpi-iot-ros-ai:~$ sudo shutdown -r now

SD 확장

$ sudo resize2fs /dev/mmcblk0p2
resize2fs 1.42.13 (17-May-2015)
Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mmcblk0p2 is now 3769088 (4k) blocks long.

SD 확장 확인

$ df -l
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root       14839632 4653484   9513188  33% /
devtmpfs          380800       0    380800   0% /dev
tmpfs             512036     316    511720   1% /dev/shm
tmpfs             512036    7456    504580   2% /run
tmpfs               5120       4      5116   1% /run/lock
tmpfs             512036       0    512036   0% /sys/fs/cgroup
/dev/mmcblk0p1    261868  213188     48680  82% /boot
tmpfs             102408      28    102380   1% /run/user/1000

How to burn Linux image to eMMC

출처 : How to burn Linux image to eMMC
bpi-copy command

root@bpi-iot-ros-ai:~# uname -a
Linux bpi-iot-ros-ai 3.4.112-sun8i #2 SMP PREEMPT Mon May 30 20:34:33 CST 2016 armv7l armv7l armv7l GNU/Linux
root@bpi-iot-ros-ai:~# fdisk -l
Disk /dev/mmcblk0: 14.7 GiB, 15811477504 bytes, 30881792 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0006c94a

Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1 *    204800   729087   524288  256M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      729088 30881791 30152704 14.4G 83 Linux


Disk /dev/mmcblk1: 7.3 GiB, 7818182656 bytes, 15269888 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000


Disk /dev/mmcblk1boot1: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mmcblk1boot0: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

이미지 복원

이미지 복원이 완료되면 SD 메모리를 제거하고 재부팅

$ sudo dd if=2016-07-21-ubuntu-mate-16.04-desktop-armhf-raspberry-pi-bpi-m2p-sd-emmc.img of=/dev/mmcblk1 bs=10MB
781+1 records in
781+1 records out
7818182656 bytes (7.8 GB, 7.3 GiB) copied, 1023.46 s, 7.6 MB/s

eMMC 부팅(SD동시 사용 - 적용실패)

출처 : Banana Pi M2+ with system on emmc, data on sd card - Allwinner H2/H3
Boot from eMMC with blank SD in slot (BPI-M3)

$ cat /etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p2  /               ext4   defaults,noatime  0       1
/dev/mmcblk0p1  /boot/          vfat    defaults          0       2
$ lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
mmcblk0boot0 179:16   0    4M  1 disk 
mmcblk0boot1 179:32   0    4M  1 disk 
mmcblk0      179:0    0  7.3G  0 disk 
쒋mmcblk0p1  179:1    0  256M  0 part /boot
붴mmcblk0p2  179:2    0    7G  0 part /
$ cat /boot/boot.cmd
#setenv device mmc
#setenv partition 0:1
setenv bpi bananapi
setenv board bpi-m64
setenv chip a64
setenv service linux
setenv kernel Image
setenv initrd initrd.img
setenv dtb pine64-plus.dtb
 
setenv bootargs "console=ttyS0,115200n8 no_console_suspend earlycon=uart,mmio32,0x01c28000 mac_addr=${ethaddr} board=${board} root=${root} rootwait panic=10 consoleblank=0 enforcing=0 loglevel=2"
 
 
setenv fdt_filename "${bpi}/${board}/${service}/${dtb}"
setenv kernel_filename "${bpi}/${board}/${service}/${kernel}"
setenv initrd_filename "${bpi}/${board}/${service}/${initrd}"
 
run load_dtb load_kernel load_initrd boot_kernel
 
## Recompile with:
## mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
## mkimage -C none -A arm -T script -d boot.cmd boot.scr

generate boot.src

$ sudo mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
Image Name:   
Created:      Sun Feb  26 11:55:34 2017
Image Type:   ARM Linux Script (uncompressed)
Data Size:    805 Bytes = 0.79 kB = 0.00 MB
Load Address: 00000000
Entry Point:  00000000
Contents:
   Image 0: 797 Bytes = 0.78 kB = 0.00 MB
$ sudo shutdown -r now

GPIO사용 (BPI-WiringPi)

출처 : Supports BananaPi BPI -M1 / M1Plus / M2 / M2P / M3

기존 설치된 wiringpi 삭제

$ sudo apt-get remove wiringpi
$ sudo apt autoremove

wiringpi 설치

$ git clone https://github.com/BPI-SINOVOIP/BPI-WiringPi.git -b BPI_M2P
$ cd BPI-WiringPi
$ chmod +x ./build
$ sudo ./build

GPIO 확인

$ gpio -v
gpio version: 2.26
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
 
Banana Pi Details:
  Type: Model BM, Revision: 1.2, Memory: 1024MB, Maker: BPI 
$ gpio readall
 +-----+-----+---------+------+---+---Pi ---+---+------+---------+-----+-----+
 | CPU | wPi |    Name   | Mode | V | Physical | V | Mode |   Name    | wPi | CPU |
 +-----+-----+-----------+------+---+----++----+---+------+-----------+-----+-----+
 |     |     |      3.3v |      |   |  1 || 2  |   |      | 5v        |     |     |
 |  12 |   8 |     SDA.1 | ALT5 | 0 |  3 || 4  |   |      | 5V        |     |     |
 |  11 |   9 |     SCL.1 | ALT5 | 0 |  5 || 6  |   |      | GND       |     |     |
 |   6 |   7 |      PWM1 | ALT3 | 0 |  7 || 8  | 0 | ALT4 | UART3-TX  | 15  | 13  |
 |     |     |       GND |      |   |  9 || 10 | 0 | ALT4 | UART3-RX  | 16  | 14  |
 |   1 |   0 |  UART2-RX | ALT5 | 0 | 11 || 12 | 0 | OUT  | UART3-CTS | 1   | 16  |
 |   0 |   2 |  UART2-TX | ALT5 | 0 | 13 || 14 |   |      | GND       |     |     |
 |   3 |   3 | UART2-CTS | ALT5 | 0 | 15 || 16 | 1 | ALT4 | UART3-RTS | 4   | 15  |
 |     |     |      3.3v |      |   | 17 || 18 | 0 | ALT3 | GPIO.PC04 | 5   | 68  |
 |  64 |  12 | SPI0_MOSI | ALT4 | 0 | 19 || 20 |   |      | GND       |     |     |
 |  65 |  13 | SPI0_MISO | ALT4 | 0 | 21 || 22 | 0 | ALT5 | UART2-RTS | 6   | 2   |
 |  66 |  14 |  SPI0_CLK | ALT4 | 0 | 23 || 24 | 0 | ALT4 | SPI0-CS   | 10  | 67  |
 |     |     |       GND |      |   | 25 || 26 | 0 | ALT3 | GPIO.PL07 | 11  | 71  |
 |  19 |  30 |     SDA.0 | ALT4 | 0 | 27 || 28 | 0 | ALT4 | SCL.0     | 31  | 18  |
 |   7 |  21 | GPIO.PA07 | ALT3 | 0 | 29 || 30 |   |      | GND       |     |     |
 |   8 |  22 | GPIO.PA08 | ALT3 | 0 | 31 || 32 | 0 | ALT3 | GPIO.PL02 | 26  | 354 |
 |   9 |  23 | GPIO.PA09 | ALT3 | 0 | 33 || 34 |   |      | GND       |     |     |
 |  10 |  24 | GPIO.PA10 | ALT3 | 0 | 35 || 36 | 0 | ALT3 | GPIO.PL04 | 27  | 356 |
 |  17 |  25 | SPDIF-OUT | ALT3 | 0 | 37 || 38 | 0 | ALT3 | GPIO.PA21 | 28  | 21  |
 |     |     |       GND |      |   | 39 || 40 | 0 | ALT3 | GPIO.PA20 | 29  | 20  |
 +-----+-----+-----------+------+---+----++----+---+------+-----------+-----+-----+
 | CPU | wPi |    Name   | Mode | V | Physical | V | Mode |   Name    | wPi | CPU |
 +-----+-----+---------+------+---+---Pi ---+---+------+---------+-----+-----+

detect I2C chips

출처 : i2cdetect(8): detect I2C chips - Linux man page

$ ls /dev/*i2c*
/dev/i2c-0  /dev/i2c-1
$ i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: 70 -- -- -- -- -- -- --  

jdk1.8 설치

출처 : 우분투(Ubuntu) Oracle(Sun) Java JDK 설치 - 사르기스

OpenJDK 제거

$ sudo apt-get purge openjdk*

repository 추가

$ sudo add-apt-repository ppa:webupd8team/java

repository index 업데이트

$ sudo apt-get update

JDK 설치

$ sudo apt-get install oracle-java8-installer

JAVA_HOME 환경변수 추가

$ sudo vi /etc/profile

내용 추가 export JAVA_HOME=/usr/lib/jvm/java-8-oracle

export JAVA_HOME=/usr/lib/jvm/java-8-oracle

pi4j

촐처 : Java I/O library for Raspberry Pi (GPIO, I2C, SPI, UART) http://www.pi4j.com
BUILDING AN EXECUTABLE PI4J JAR

$ sudo apt install maven
$ git clone https://github.com/Pi4J/pi4j.git
$ cd pi4j/pi4j-native
$ mvn package

pi4j pwm 오류

촐처 : How to: banana pi BPI-M3 install BPI-WiringPi - Linux - banana pi ...

PWM 관련 오류가 있어 수정해 보려고 했으나 포기

val pwmWrite 0 <= X <= 1024
Or you can set new range by yourself by pwmSetRange(range
저작자 표시
신고

Banana Pi - BPI-M2+ mjpg-streamer

OS/Banana Pi 2017.02.26 04:49 Posted by 파란크리스마스

BPI-M2+ mjpg-streamer

출처 : 【BPI-M2+】之mjpg-streamer测试和体验- Bananap讨论区- 烽火社区 ...
MJPG-Streamer › Wiki › ubuntuusers.de
라즈베리파이에서 웹캠 mjpg-streamer 따라하기|작성자 서리
mjpg-streamer 웹캠 영상 스트리밍 | Mungrrr

관련 라이브러리 설치

$ sudo apt-get install libjpeg8-dev libv4l-dev subversion
$ sudo apt-get install imagemagick

mjpg-streamer 컴파일 및 설치

출처 : http://www.lavrsen.dk/svn/motion/tags/3.2.9/picture.c

$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
$ cd mjpg-streamer
$ make USE_LIBV4L2=true clean all
$ sudo make install
install --mode=755 mjpg_streamer /usr/local/bin
install --mode=644 input_ov5640.so input_uvc.so output_file.so output_udp.so output_http.so input_testpicture.so input_file.so /usr/local/lib/
install --mode=755 -d /usr/local/www
install --mode=644 -D www/* /usr/local/www

input_ov5640.so

input_ov5640.tar.gz

mjpg-streamer의 input_uvc.so는 YUV만 지원하고, BPI-M2+의 카메라인 OV5640는 YUV420코덱만 지원하기 때문에, mjpg-streamer에서 사용 할 수 없습니다.

제가 작업한 OV5640의 YUV420코덱을 지원하는 so 파일을 공개 합니다.
BPI-M2+의 카메라인 OV5640를 사용해서 mjpg-streamer로 스크리밍 하시려면 첨부한 파일을 사용하세요.

LD_LIBRARY_PATH 경로 추가

$ echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/lib/mjpg-streamer" | sudo tee -a /etc/profile

mjpg-streamer 실행

$ ./mjpg_streamer -i "./input_ov5640.so -y -n" -o "./output_http.so -w ./www"
MJPG Streamer Version: svn rev: 3:172M
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 640 x 480
 i: Frames Per Second.: 5
 i: Format............: YUV420
 i: JPEG Quality......: 80
 o: www-folder-path...: ./www/
 o: HTTP TCP port.....: 8080
 o: username:password.: disabled
 o: commands..........: enabled

서비스등록

$ sudo vi /etc/init.d/mjpg_streamer

mjpg_streamer 파일 내용

#!/bin/bash
# /etc/init.d/mjpg_streamer.sh
# v0.2 phillips321.co.uk
### BEGIN INIT INFO
# Provides:          mjpg_streamer.sh
# Required-Start:    $network
# Required-Stop:     $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: mjpg_streamer for webcam
# Description:       Streams /dev/video0 to http://IP/?action=stream
### END INIT INFO

#
export width=640
export height=480
export fps=10
export SHUTDOWN_WAIT=2
export QUALITY=75

if [ -n "$2" ]; then
  width=$2 
fi

if [ -n "$3" ]; then
  height=$3
fi

if [ -n "$4" ]; then
  fps=$4
fi

export LD_MJPG_STREAMER=/usr/local/lib

f_message(){
        echo "[+] $1"
}

mjpg_streamer_pid() {
  echo `ps aux | grep mjpg_streamer | grep -v grep | awk '{ print $2 }'`
}

start() {
  pid=$(mjpg_streamer_pid)
  if [ -n "$pid" ] 
  then
    echo "mjpg_streamer is already running (pid: $pid)"
  else
    # Start mjpg_streamer
		f_message "Starting mjpg_streamer"
		mjpg_streamer -b -i "$LD_MJPG_STREAMER/input_ov5640.so -r "$width"x"$height" -f $fps -q $QUALITY -y" -o "$LD_MJPG_STREAMER/output_http.so -p 8080 -w /usr/local/www"
		sleep 2
		f_message "mjpg_streamer started"
  fi

  return 0
}

stop() {
  pid=$(mjpg_streamer_pid)
  if [ -n "$pid" ]
  then
    f_message "Stopping mjpg_streamer..."
    kill -9 $pid

    let kwait=$SHUTDOWN_WAIT
    let count=0;
    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
    do
      echo -n -e "\nwaiting for processes to exit";
      sleep 1
      let count=$count+1;
    done

    if [ $count -gt $kwait ]; then
      echo -n -e "\nkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\n"
      kill -9 $pid
    fi
  else
    echo "mjpg_streamer is not running"
  fi
 
  return 0
}

# Carry out specific functions when asked to by the system
case "$1" in
        start)
                 start
                 ;;
        stop)
                 stop
                 ;;
        restart)
                 stop
                 sleep 2
                 start
                 ;;
        resolution)
                resolution=`ps axu | grep mjpg_streamer | grep -v grep | awk '{ print $16 }'`
                currfps=`ps axu | grep mjpg_streamer | grep -v grep | awk '{ print $18 }'`
                if [ -n "$resolution" ];
                then
                        echo "${resolution}"x"$currfps"
                else
                        echo "0x0x0"
                fi
                ;;
        status)
                pid=`ps -A | grep mjpg_streamer | grep -v "grep" | grep -v mjpg_streamer. | awk '{print $1}' | head -n 1`
                if [ -n "$pid" ];
                then
                        f_message "mjpg_streamer is running with pid ${pid}"
                        f_message "mjpg_streamer was started with the following command line"
                        cat /proc/${pid}/cmdline ; echo ""
                else
                        f_message "Could not find mjpg_streamer running"
                fi
                ;;
        *)
                f_message "Usage: $0 {start|stop|status|restart}"
                exit 1
                ;;
esac
exit 0

등록

$ sudo chmod u+x /etc/init.d/mjpg_streamer
$ sudo update-rc.d mjpg_streamer defaults

서비스 실행 및 실행 확인

$ sudo service mjpg_streamer start
$ sudo service mjpg_streamer status

● mjpg_streamer.service - LSB: mjpg_streamer for webcam
   Loaded: loaded (/etc/init.d/mjpg_streamer; bad; vendor preset: enabled)
   Active: active (running) since Sat 2017-03-11 23:04:13 CST; 15min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 4201 ExecStart=/etc/init.d/mjpg_streamer start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/mjpg_streamer.service
           └─4015 mjpg_streamer -b -i /usr/local/lib/input_ov5640.so -r 1280x720 -f 24 -q 45 -y -o /usr/local/lib/output_http.so -p 8080 -w /usr/local/www
 
Mar 11 23:04:11 bpi-iot-ros-ai mjpg_streamer[4201]: [+] Starting mjpg_streamer
Mar 11 23:04:11 bpi-iot-ros-ai mjpg_streamer[4201]: enabling daemon modeforked to background (4210)
Mar 11 23:04:11 bpi-iot-ros-ai mjpg_streamer[4210]: MJPG-streamer [4210]: MJPG Streamer Version: svn rev: 3:172M
Mar 11 23:04:11 bpi-iot-ros-ai mjpg_streamer[4210]: MJPG-streamer [4210]: Using V4L2 device.: /dev/video0
Mar 11 23:04:11 bpi-iot-ros-ai mjpg_streamer[4210]: MJPG-streamer [4210]: Desired Resolution: 640 x 480
Mar 11 23:04:11 bpi-iot-ros-ai mjpg_streamer[4210]: MJPG-streamer [4210]: Frames Per Second.: 10
Mar 11 23:04:11 bpi-iot-ros-ai mjpg_streamer[4210]: MJPG-streamer [4210]: Format............: YUV420
Mar 11 23:04:11 bpi-iot-ros-ai mjpg_streamer[4210]: MJPG-streamer [4210]: JPEG Quality......: 75
Mar 11 23:04:13 bpi-iot-ros-ai mjpg_streamer[4201]: [+] mjpg_streamer started
Mar 11 23:04:13 bpi-iot-ros-ai systemd[1]: Started LSB: mjpg_streamer for webcam.

실행

motion

출처 : mjpegtoyuv420p patch for Logitech Quickcam Pro

$ svn co http://www.lavrsen.dk/svn/motion/trunk motion
$ cd motion
$ ./configure
$ make
저작자 표시
신고

Banana Pi - BPI-M2+ Camera(OV5640)

OS/Banana Pi 2017.02.26 04:27 Posted by 파란크리스마스

BPI-M2+ Camera(OV5640)

출처 : BPI-M2+ OV5640 camera linux driver is work fine
BPI-M2+ camera module

Camera 모듈 설치

$ sudo vi /etc/modules

내용 추가

ov5640
vfe_v4l2

Camera 설치 확인

$ dmesg | grep ov5640
[    8.330079] [VFE]Find sensor name is "ov5640", i2c address is 78, type is "YUV" !
[    8.330090] [VFE]Sub device register "ov5640" i2c_addr = 0x78 start!
[    8.535088] [VFE]Sub device register "ov5640" is OK!
$ ls /dev/video*
/dev/video0

Camera 정보

$ modinfo ov5640
filename:       /lib/modules/3.4.112-sun8i/kernel/drivers/media/video/sunxi-vfe/device/ov5640.ko
license:        GPL
description:    A low-level driver for ov5640 sensors
author:         raymonxiu
alias:          i2c:ov5640
depends:        cci,vfe_subdev
intree:         Y
vermagic:       3.4.112-sun8i SMP preempt mod_unload modversions ARMv7 p2v8 

Camera 캡쳐 프로그램 컴파일 및 실행

출처 : https://github.com/avafinger/ov5640

$ git clone https://github.com/avafinger/cap-v4l2
$ cd cap-v4l2
$ sudo ./install_deps.sh
$ ./build_script.sh
$ ./cap 1280 720 4 1 -999 -1 -1
저작자 표시
신고


 

티스토리 툴바