搜索
bottom↓
回复: 44

树莓派Zero从零开始折腾的那些事「附几本PDF参考书」

  [复制链接]

出0入0汤圆

发表于 2019-9-5 12:55:58 | 显示全部楼层 |阅读模式
本帖最后由 leon...... 于 2019-9-6 11:46 编辑

树莓派不断更新,网上很多教程试来试去发现配置已变了,浪费了不少时间,所以记录一下这个把多月折腾树莓派的辛酸经历,给和我一样的初学者共勉


工具准备:
        * 树莓派+电源
        * USB转串口
        * SD卡(最好4G class10以上)SD卡速度是硬伤

        * PanasonicSDFormatter
        * Win32DiskImager  (后缀改7Z)
        * 串口终端(我使用的是MACOS自带终端),或(WIN系统)SCCOM+PUTTY

          

【1】安装系统
        *下载镜像:
                https://www.raspberrypi.org/downloads/raspbian/
                网页下面的3个版本都试过,zero最好还是跑lite版本,其它版本也行,配置成命令行界面启动就好了,图形界面太卡了。

        *格式化SD卡:
                使用PanasonicSDFormatter,  特别是SD卡重新刷系统时这一步必须

        *烧写镜像
                使用* Win32DiskImage, 烧写镜像到格式化好的SD卡,也可以使用命令行,如果不熟悉还是罢了,万一写错盘可是大事。
                [我在使用电脑自带的SD读卡器烧写的镜像无法启动,换了一个读卡器才正常]

        *启用串口
                将SD卡的boot盘目录下的config.txt加上一行 : uart_enable=1 (启用串口)
                如果有接HDMI显示器那么同时将#hdmi_force_hotplug=1的#号去掉
       
        *安全弹出SD卡,SD卡放入到树莓派并接入电源,可以看到绿灯不停闪烁表示启动中,电流才80ma。
               

        *串口连接树莓派
               
                串口连接树莓派(图中GPIO14,GPIO15 ), 并启动终端(例如我使用的是MACOS):
                 ls /dev/cu* 查看电脑串口, 比如我的使有的CP2102查看到串口设备是/dev/cu.SLAB_USBtoUART
                终端输入 screen /dev/cu.SLAB_USBtoUART 115200 启动一个串口终端,回车后会提示输入用户名和密码登录树莓派
                用户名:pi,
                密码:raspberry
        PS: WIN系统使用类似的串口工具(比如SSCOM),在设备管理器查看对应的COM口后,使用串口工具连接

【2】系统配置

        *系统配置: 使用命令 sudo raspi-config 启动配置工具

                -》2 Network Options -》N2 Wi-Fi -》CN China (选择国家), 然后跟据提示输入WIFI的SSID和密码
                -》 4 Localisation Options -》 I1 Change Locale -》按空格选中en_US和zh_CN后按回车确认
                -》5 Interfacing Options  -》P2 SSH(激活SSH)P4 SPI(激活SPI)
                -》7 Advanced Options -》A1 Expand Filesystem (扩展更的SD卡空间,因为在镜像写入时,分区大小被限制了)

        *校验一下结果:
                ifconfig  如果WIFI正常,这里的wlan0可以看到连接状态和IP, 复制这个IP用于SSH连接
                sudo nano /etc/wpa_supplicant/wpa_supplicant.conf  将会打开配置文件,可以看到刚才输入的WIFI信息 (CTRL+X退出)

                解决locale问题 : locale: Cannot set LC_CTYPE to default locale: No such file or directory
                sudo nano /etc/default/locale //增加 LC_CTYPE=xx 比如LC_CTYPE=en_US.UTF-8
                locale -a         //查看当前系统系统支持的字符编码方式
                locale                //查看locale

        *SSH,
                MACOS:在终端使用命令:ssh pi@x.x.x.x   (ssh 树莓派用户名@树莓派IP)
                                        第一次连接会有一个提示,输入yes就可以了,然后输入密码就可以登陆了。
                WIN:则可以使用putty,填入用户名和IP连接就可以了

        *设置静态IP
                如果每次都要查看IP才到通过SSH连接,那真是麻烦死了,这时可以设置静态IP
                sudo nano /etc/dhcpcd.conf 将会打开配置文件,在最后面加入(注意大小写):

  1. interface wlan0

  2. ssid OOOOO
  3. inform 192.168.0.9/24
  4. static ip_address=192.168.0.9/24
  5. static routers=192.168.0.1
  6. static domain_name_servers=192.168.0.1       
复制代码


                这里的ssid, ip, router, domain都要换成你指定的,否则无法上网和连接了
                关于IP的后缀,如果掩码是255.255.255.0那么就填/24, 如果掩码是255.255.255.240那么就填/28

                这个时候可以复位一下树莓派了 sudo reboot, 可以留意串口的启动信息。

                重启动,使用新的自定义IP连接SSH
                        ssh pi@x.x.x.x


        * 这个时候如果出现一个警告 @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @,可以使用命令清除掉缓存后再次连接SSH。
                ssh-keygen -R x.x.x.x  (记住这里的xxxx是当前要连接的IP)

        哇哈哈哈,您可以扔掉USB转串口工具了。

【3】更换软件源并更新系统
        编辑源文件 `sudo nano /etc/apt/sources.list` 文件,删除原文件所有内容,用以下内容取代:
                deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
                deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib

        编辑源文件 `sudo nano /etc/apt/sources.list.d/raspi.list` 文件,删除原文件所有内容,用以下内容取代:
                deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui

        编辑镜像站后,请使用sudo apt-get update命令,更新软件源列表,同时检查您的编辑是否正确, 显示信息:
                Get:1 http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian buster InRelease [15.0 kB]
                ......
                49% [5 Sources 10.4 MB/11.3 MB 92%]

        然后使用sudo apt-get dist-upgrade命令,更新所有包。
                dist-upgrade如果这个包没有发布更新,就不管它;如果发布了更新,就把包下载到电脑上,并安装。
                由于包与包之间存在各种依赖关系。upgrade只是简单的更新包,不管这些依赖,它不和添加包,或是删除包。
                而dist-upgrade可以根据依赖关系的变化,添加包,删除包

。。。持续更新中

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2019-9-6 14:04:22 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-6 14:23 编辑

以下书籍都是来自已本坛坛友的分享,无奈翻不到原贴,直接上传到论坛吧。再次谢谢这么坛友


>第一章:強大的CD命令技巧
>第二章:日期操作
>第三章: SSH (Secure SHell)客戸端命令
ゝ第四章: 重要的linux命令
>第五章: PS1,PS2,PS3和PROMPT_ COMMAND
>第六章: 用功能彊大的彩色終端快速使用PS1
>第七章:ヨ档和圧縮;
>第八章: history命令
>第九章:系統管理任努
>第十 章: Apachectl和Httpd突例
>第十一 章: Bash脚本
>第十二章:監控系統和性能
>第十三章一些額外的技巧




▼第一部分遇见树莓派
第1章漫谈树莓派
第2章初识树莓派
▼第二部分玩转树莓派
第3章点亮树莓派
第4章Linux基本指令入门
第5章将树莓派连上网络
第6章使用树莓派搭建家用服务器
第7章使用树莓派打造家庭影音娱乐中心
▼第三部分进阶树莓派
第8章用Python在树莓派上进行编程
第9章使用树莓派的GPIO
第10章树莓派和图像处理
附录1另类视频输出的体验
附录2树莓派牵手Arduino










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入58汤圆

发表于 2019-9-5 14:10:26 | 显示全部楼层
万里长征这才第一步刚结束啊

出0入0汤圆

发表于 2019-9-5 14:12:25 | 显示全部楼层
拿树莓派来做什么我比较感兴趣,你这些内容一般都比较容易解决

出0入0汤圆

发表于 2019-9-5 14:13:14 | 显示全部楼层
用这个做东西性价比还是很高的。

出0入0汤圆

 楼主| 发表于 2019-9-5 14:27:28 | 显示全部楼层
hyghyg1234 发表于 2019-9-5 14:13
用这个做东西性价比还是很高的。

安装方便,资源丰富,可玩性也高啊。装上python后,MG。。。

出0入0汤圆

 楼主| 发表于 2019-9-5 14:30:40 | 显示全部楼层
pazulin 发表于 2019-9-5 14:12
拿树莓派来做什么我比较感兴趣,你这些内容一般都比较容易解决

也不完全是,对于初学者,还是可以少走一些弯路。比如一个WIFI多静态路由问题,系统自动生成的是SSID xxxx, 我需要改成ssid xxxx才能正确匹配到。也是叫我好难才想到大小写问题。当然高手无视。见笑了。

出0入0汤圆

发表于 2019-9-5 14:35:01 | 显示全部楼层
这是很好的开端,继续努力吧楼主

出0入0汤圆

发表于 2019-9-5 14:39:26 | 显示全部楼层
支持一下,可以加个和其他版本不同处的注意事项

出0入0汤圆

 楼主| 发表于 2019-9-5 14:46:04 | 显示全部楼层
shawn_bu 发表于 2019-9-5 14:10
万里长征这才第一步刚结束啊

是的啊,还请多多指教

出0入0汤圆

 楼主| 发表于 2019-9-5 14:50:36 | 显示全部楼层
acchkr 发表于 2019-9-5 14:39
支持一下,可以加个和其他版本不同处的注意事项

暂时还没有太大的发现,要说有什么不同,就是在python远程开发时,图形界面版本库太多,很难同步成功。我只能加大虚拟内存,同时删除一些不用的QT库。 所以,ZERO还是用LITE系统吧

出0入0汤圆

 楼主| 发表于 2019-9-5 14:59:46 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-6 10:27 编辑

【4】 驱动SPI

        脚位图

        驱动库 https://github.com/notro/fbtft/issues
        我使用的屏是SPI TFT 这里是资料
        最新的树莓派已经内置了SPI TFT的库fbtft,我们只需要加载就可以了,直接sudo modprobe fbtft_device name=sainsmart18

        对于我使用的SST7735S还需要调整一下参数才能正确显示。需要修改一下配置参数

        【A.】 创建flexfb 驱动, 新建一个配置文件 ‘sudo nano /etc/modprobe.d/fbtft.conf’, 然后加入下面内容,CTRL+S保存
       
  1. options fbtft_device name=flexfb gpios=reset:25,dc:24,led:18 speed=12000000 bgr=0 fps=100 custom=1 height=128 width=192
  2. options flexfb setaddrwin=0 width=192 height=128 init=-1,0x01,-2,150,-1,0x11,-2,500,-1,0xB1,0x01,0x2C,0x2D,-1,0xB2,0x01,0x2C,0x2D,-1,0xB3,0x01,0x2C,0x2D,0x01,0x2C,0x2D,-1,0xB4,0x07,-1,0xC0,0xA2,0x02,0x84,-1,0xC1,0xC5,-1,0xC2,0x0A,0x00,-1,0xC3,0x8A,0x2A,-1,0xC4,0x8A,0xEE,-1,0xC5,0x0E,-1,0x20,-1,0x36,0xC8,-1,0x3A,0x05,-1,0xE0,0x0f,0x1a,0x0f,0x18,0x2f,0x28,0x20,0x22,0x1f,0x1b,0x23,0x37,0x00,0x07,0x02,0x10,-1,0xE1,0x0f,0x1b,0x0f,0x17,0x33,0x2c,0x29,0x2e,0x30,0x30,0x39,0x3f,0x00,0x07,0x03,0x10,-1,0x29,-2,100,-1,0x13,-2,10,-3
复制代码


        重点有三个地方,
        speed,  控制spi输出的时钟速度,要适配你的屏,比如我接SPI TFT时设的是48M,接LED屏时只能设12M
        fps, 刷新率,实际测试并不完全准确,实际上刷新率会受屏的分辩率及speed的影响。如果你关心FPS,最好实测一下
        height width  屏幕大小, 比如我的SPI屏7735设成128 128就会有黑边,只能设成132 128,而LED屏我需要设成192X128来匹配
       
        【B.】 新建驱动加载文件 : ‘sudo nano /etc/modules-load.d/fbtft.conf’ ,并加入下面内容 让系统启动时加载7735S的驱动
                spi-bcm2835
                flexfb
                fbtft_device
       
        【C.】安装fbcp驱动 重启一下树莓派,用心观察会发现,先是雪花屏,然后变成全黑,说明驱动起作用了。那么我们可以把SPI设为主屏,或者将主屏镜像到SPI,我选择的是后者。

                sudo apt-get install cmake git
                cd ~
                git clone https://github.com/tasanakorn/rpi-fbcp
                cd rpi-fbcp/
                mkdir build
                cd build/
                cmake ..
                make
                sudo install fbcp /usr/local/bin/fbcp

        安装完成后执行‘fbcp &’(注意&号一定要加,这样程序会在后台运行),屏幕上就可以看到树莓派字符界面了

        如果你想设置开机启动fbcp,可以使用命令行打开配置文件:
                sudo nano /etc/rc.local
        然后在 exit 0 前面添加 fbcp &。注意一定要添加"&" 。

        【D.】 修改主屏分辨率,是不是发现字符都被挤压了一样,修改一下主屏分辨率就可以了,使用命令行打开配置文件:’sudo nano /boot/config.txt‘
                修改这二个参数:
                framebuffer_width=128
                framebuffer_height=128

                或者我显示LED屏时
                framebuffer_width=192
                framebuffer_height=128

                然后重启树莓派:



        LED屏和SPI屏同用一个驱动,只是稍改一下上面所描述的参数,关于LED屏,可以看这里了解更多https://www.amobbs.com/thread-5716651-1-1.html
               

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2019-9-5 15:27:20 | 显示全部楼层
leon...... 发表于 2019-9-5 14:59
【4】 驱动SPI
        驱动库 https://github.com/notro/fbtft/issues
        我使用的屏是SPI TFT 这里是资料

spi屏很多,可否搞一大堆拼,片选怎么设置。

出0入0汤圆

 楼主| 发表于 2019-9-5 15:32:29 | 显示全部楼层
gmyu 发表于 2019-9-5 15:27
spi屏很多,可否搞一大堆拼,片选怎么设置。

别啊,直接选一个480X320不就好了。

出0入0汤圆

 楼主| 发表于 2019-9-5 16:42:31 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-6 10:28 编辑

【5】安装FileZilla电脑与树莓派交换文件, ,配置参数:

        主机:填树莓派IP
        用户名:树莓派用户名
        密码:树莓派密码
        端口:22

        点击连接,就可以增删修改树莓派上文件了。

【6】安装网络共享文件 Samba 服务, 可以实现系统之间的文件与打印机的共享

        * 安装samba:
                apt-get install samba

        * 创建专门的用户和目录
                sudo useradd homeuser
                sudo passwd homeuser
                sudo mkdir /var/share
                sudo chown -R homeuser /var/share

        * 配置共享       
                sudo nano /etc/samba/smb.conf

                在结尾加入
                [share]
                   comment = Share   
                   path = /var/share          # 共享文件的路径
                   read only = no
                   browseable = no        # 可被其他人看到资源名称(非内容)
                   create mask = 0777         # 新建文件的权限
                   directory mask = 0777        # 新建目录的权限

        * 设置samba远程访问密码
                sudo smbpasswd -a homeuser                //远程访问密码

        * 重启树莓派并测试samba。
                WIN 在运行中输入IP \\xx.xx.xx.xx
                MACOS 访达-》前往-》连接服务器-》填写 smb://xx.xx.xx.xx/share

                输入用户名和密码(如上面则是homeuser, 远程访问密码), 这样就可以方问Samba服务器中的文件了。

【7】搭建DLNA流媒体服务器
        *安装
                sudo apt-get install minidlna

        *可以查看minidlna服务器状态是否正常运行
                sudo systemctl status minidlna
       
        *大多时候我们会修改成自定义的目录,比如我是这样修改的
                :直接在smb目录下创建DLNA目录,并增加homeuser用户
                        cd /var/share
                        sudo mkdir DLNA
                        cd DLNA
                        sudo mkdir Music Video Picture
                        cd /var
                        sudo chown -R homeuser ./share  //homeuser是之前创建的samba用户

                :打开配置文件自定义目录
                        sudo nano /etc/minidlna.conf

                :=A表示这个目录是存放音乐的,当minidlna读到配置文件时,它会自动加载这个目录下的音乐文件
                        media_dir=A,/var/share/DLNA/Music
                        media_dir=P,/var/share/DLNA/Picture
                        media_dir=V,/var/share/DLNA/Video

        *重新启动minidlna服务, 让配置生效,并查看运行状态
                sudo systemctl restart minidlna
                sudo systemctl status minidlna

        *在电脑上查看流媒体资源个数
                http://树莓派的IP地址:8200/

        打开电视和电脑或手机,可以愉快地娱乐一下了

               

出0入0汤圆

 楼主| 发表于 2019-9-5 16:43:00 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-6 12:30 编辑

【9】安装播放器

[] 安装
        sudo apt install mplayer
        sudo apt install omxplayer
        sudo apt install fbi

[] mplayer播放音视频
        sudo mplayer -nolirc -vo fbdev2:/dev/fb0 v.mp4
        sudo mplayer -fs -vf scale=192:128 -nolirc -vo fbdev2:/dev/fb0 '001 冰淇淋_高清.mp4'
        ****参数fb0是输出到主屏,fb1是车出到LCD,如果启用了fbcp,那么应该输出到fb0
        ****如果文件名有空格,要用''号括起来

[] omxplayer播放音视频 [硬件h264解码]
        sudo omxplayer --vol -2000 -o alsa '001 冰淇淋_高清.mp4'

[] fbi 显示图片
        sudo fbi -d /dev/fb0 -T 1 -noverbose -a test.jpg


使用FileZilla或Samba上传些 '善良的' 文件,让我娱乐一下再继续.......

【10】输出PWM音频
        sudo nano /boot/config.txt,找到dtparam=audio=on,增加下面配置信息

                dtparam=audio=on
                dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4        #13,18输出双声道
                disable_audio_dither=1                #据说可以消除一点杂音,在ZERO上没鬼用
                audio_pwm_mode=2                #据说声音会好一点

        sudo reboot 重启树莓派生效

【】音量调节工具alsamixer
【】又或者可以安装蓝牙耳机,PWM音频太差了
        //依耐: bluez pulseaudio
        sudo apt-get install pulseaudio-module-bluetooth
        然后使用bluetoothctl打开蓝牙控制界面配置蓝牙

【11】安装AirPlay服务: shairport
        //安装依赖工具包
        sudo apt install libssl-dev libavahi-client-dev libasound2-dev libao-dev libpulse-dev
        //安装shairport
        sudo apt install shairport-sync

        习惯性sudo reboot 重启系统让服务生效。

        重启后在IPHONE声音控制界面会出现AirPlay按钮,或MAC声音控制图标那里会出现一个小音箱图标Raspberrypi, 说明AirPlay已开始正常工作....
        AirPlay默认音乐比较小,留意使用alsamixer调大音量。

【12】搭建个人网站
        这个比较简单:
                sudo apt install apache2
                apt install php

        服务状态查询,或控制
                 service apache2 status[]

        查看临听的端口
                netstat -ln|grep 80

        使用电脑浏览器输入: 树莓派IP (比如我的 162.20.10.9), 就会打开一个Apache2 Debian Default Page
        这个文件在树莓派的目录/var/www/html/index.html

【13】安装花生层内网穿透服务  
        安装:
                sudo dpkg -i phddns_rapi_3.0.1.armhf.deb
       
        如果想删除它:
                sudo dpkg -r phddns
       
        完成安装后会出现设备ID
  1. +--------------------------------------------------+
  2. |             Oray PeanutHull Linux 3.0            |
  3. +--------------------------------------------------+
  4. |  SN: RAPI000000000000   Default password: admin  |
  5. +--------------------------------------------------+
  6. |    Remote Management Address http://b.oray.com   |
  7. +--------------------------------------------------+
  8. Processing triggers for systemd (241-5+rpi1) ...
复制代码


        在浏览器上打开http://b.oray.com,输出SN和PASSWORD,会出现绑定二维号
        手机下载一个花生壳并注册一个免费帐号,然后扫描这个二维码绑定设备,花生壳会自动生成一个域名
        然后在内网穿透配置页面输入你的树莓派IP和其它信号完成穿透绑定即可


        最后手机断开WIFI,使用4G上网,输入域名测试是否成功穿透。这时如果正常会打开树莓派的 /var/www/html/index.html页面

        然后,,JS+PHP+PYTHON+树莓派,可以做很多很多事情,,,,,,,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-9-5 17:12:49 | 显示全部楼层
楼主,能否写一个最简单的,开机自动运行用户程序,间隔打印helloworld 或者闪灯

出0入0汤圆

 楼主| 发表于 2019-9-5 17:39:34 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-5 17:47 编辑
mPiDDR 发表于 2019-9-5 17:12
楼主,能否写一个最简单的,开机自动运行用户程序,间隔打印helloworld 或者闪灯
...


朋友,确实我做的第一次事情就是点亮个LED,不过这个过程被我给忽略掉了。

出150入640汤圆

发表于 2019-9-5 19:06:11 | 显示全部楼层
印象中的嵌入式ARMLINUX,不是这么玩的,别误入歧途!
而且这货芯片手册不开放,电路图没有。学不到精髓!

出20入62汤圆

发表于 2019-9-5 20:11:33 | 显示全部楼层
刚买了个4b~
惭愧~已经开始吃灰了~

出130入129汤圆

发表于 2019-9-5 21:07:42 来自手机 | 显示全部楼层
我有树莓派3b和香橙派pi one,发现pi one比较好玩,起码可以跑安卓

出0入0汤圆

 楼主| 发表于 2019-9-5 21:50:29 | 显示全部楼层
天下乌鸦一般黑 发表于 2019-9-5 20:11
刚买了个4b~
惭愧~已经开始吃灰了~

我的也刚到,这个总结写完后准备用4B刷 64位ubuntu

出0入0汤圆

 楼主| 发表于 2019-9-5 21:51:39 | 显示全部楼层
68336016 发表于 2019-9-5 21:07
我有树莓派3b和香橙派pi one,发现pi one比较好玩,起码可以跑安卓

没玩过PI ONE,跑安卓能跑欢快吗?

出0入0汤圆

发表于 2019-9-5 22:15:45 | 显示全部楼层
全彩的LED点阵屏效果不错

出0入0汤圆

发表于 2019-9-5 22:17:00 | 显示全部楼层
是树莓派4吗 ?

出130入129汤圆

发表于 2019-9-6 00:48:52 | 显示全部楼层
leon...... 发表于 2019-9-5 21:51
没玩过PI ONE,跑安卓能跑欢快吗?

PI ONE在安卓上播放视频1080P很流畅,不过也没想到怎么物尽其用

出0入4汤圆

发表于 2019-9-6 08:19:26 | 显示全部楼层
我觉得Zero不适合用来开发和玩,太慢了。一般我先在P3B+调试完,在移过去zero使用。

出0入0汤圆

 楼主| 发表于 2019-9-6 09:13:26 | 显示全部楼层
68336016 发表于 2019-9-6 00:48
PI ONE在安卓上播放视频1080P很流畅,不过也没想到怎么物尽其用

我在想自已学会了,是不是可以拿去教小朋友做些什么好玩的。ESP32的PYTHON太弱了,ZERO完全另一个世界。

出0入0汤圆

 楼主| 发表于 2019-9-6 09:14:36 | 显示全部楼层
lwy86 发表于 2019-9-6 08:19
我觉得Zero不适合用来开发和玩,太慢了。一般我先在P3B+调试完,在移过去zero使用。 ...

我也这样觉得的,不过我现在装LITE,写了几个PYTHON程序,还没有发现太慢。

出0入0汤圆

 楼主| 发表于 2019-9-6 09:22:24 | 显示全部楼层

不是4,是Zero, 下图左边是4, 右边是ZERO

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-9-6 09:25:01 | 显示全部楼层
天下乌鸦一般黑 发表于 2019-9-5 20:11
刚买了个4b~
惭愧~已经开始吃灰了~

别惭愧~朋友,你值得拥有

出0入4汤圆

发表于 2019-9-6 10:16:58 | 显示全部楼层
leon...... 发表于 2019-9-6 09:25
别惭愧~朋友,你值得拥有

4b 比 3B+ 开机快多少?

出0入0汤圆

 楼主| 发表于 2019-9-6 10:25:57 | 显示全部楼层
lwy86 发表于 2019-9-6 10:16
4b 比 3B+ 开机快多少?


还没有测试过,好像有个命令可以测试开机时间的,回头我试试

出0入0汤圆

发表于 2019-9-7 09:01:27 | 显示全部楼层
不错,辛苦啦楼主,收藏一个

出0入0汤圆

发表于 2019-9-7 09:19:48 | 显示全部楼层
还没体验过树莓派的魅力,收藏一下备用

出0入0汤圆

 楼主| 发表于 2019-9-10 18:19:46 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-10 19:10 编辑

树莓派上安装好完整的python3, PHP, 再结合强大的OMXplayer来制作一个简单的点播系统。

【】最好先集结牛比的开发工具:
  *python强大的开发工具:pycharm   (pycharm远程开发python的详细配置方法)
  *php强大大的开发工具:phpStorm

【】player_service.py
        基于omxplayer-wrapper(https://github.com/willprice/python-omxplayer-wrapper)开发,使用python来控制播放及读出播放状态
        更多资料可以查看官网获取:https://python-omxplayer-wrapper.readthedocs.io/en/latest/

        附上py源代码:
  1. #!/usr/bin/env python3

  2. import os
  3. import socketserver
  4. import threading
  5. import json
  6. import atexit
  7. from RPi import GPIO

  8. from omxplayer.player import OMXPlayer
  9. from pathlib import Path
  10. from time import sleep

  11. # PATH需要修改成树莓派正确的存放目录
  12. AUDIO_PATH = "/var/homeshare/DLNA/Music/"
  13. VIDEO_PATH = "/var/homeshare/DLNA/Video/"
  14. APP_NAME = "OMXPlayer"
  15. TAG = __file__ + ':'


  16. # 全局变量
  17. play = dict({
  18.     'volume': 0.1,
  19.     'total_time': 0,
  20.     'current_time': 0,
  21.     'playback_status': 'stop'
  22. })
  23. cmd_update = None
  24. player = None
  25. server = None

  26. class MyServer(socketserver.BaseRequestHandler):
  27.     '''
  28.     数据接收服务
  29.     '''
  30.     def handle(self):
  31.         conn = self.request
  32.         # conn.sendall(bytes(APP_NAME, encoding="utf-8"))
  33.         # print("conn is :", self.request)  # conn

  34.         while True:
  35.             try:
  36.                 ret_bytes = conn.recv(1024)
  37.                 if not ret_bytes:
  38.                     break

  39.                 ret_str = str(ret_bytes, encoding="utf-8")
  40.                 ret = data_process(ret_str)
  41.                 print(ret)

  42.                 conn.sendall(bytes(ret, encoding="utf-8"))

  43.             except Exception as e:
  44.                 print(TAG, 'handle error',  e)
  45.                 break


  46. def data_process(ret_str):
  47.     global cmd_update, play
  48.     '''
  49.     数据JSON/DICT分析处理
  50.     '''
  51.     ret = 'error'
  52.     try:
  53.         d = json.loads(ret_str)
  54.         if 'app' in d and d['app'] == APP_NAME:
  55.             play.update(d)
  56.             cmd_update = dict()
  57.             cmd_update.update(d)
  58.             ret = json.dumps(play)
  59.         else:
  60.             print(TAG, 'app error:', d)
  61.     except Exception as e:
  62.         print(TAG, 'json loads error', e)

  63.     return ret



  64. # 正常、异常退出处理
  65. @atexit.register
  66. def atexit_fun():
  67.     print(TAG + 'i am exit, stack track:')
  68.     GPIO.cleanup()
  69.     if server is not None:
  70.         server.shutdown()
  71.         server.server_close()

  72.     if player is not None:
  73.         player.quit()


  74. def led_run():
  75.     GPIO.setmode(GPIO.BCM)
  76.     GPIO.setup(21, GPIO.OUT)

  77.     while True:
  78.         GPIO.output(21, GPIO.HIGH)
  79.         if 'led_duty' in play:
  80.             sleep(0.1 * int(play['led_duty']))
  81.         else:
  82.             sleep(0.5)
  83.         GPIO.output(21, GPIO.LOW)
  84.         sleep(0.5)


  85. class Player(OMXPlayer):
  86.     def __init__(self, *args, **kwargs):
  87.         super(Player, self).__init__(*args, **kwargs)
  88.         self.status = True
  89.         self.stopEvent = self.stop_event

  90.     @staticmethod
  91.     def stop_event(obj):
  92.         obj.status = False
  93.         print('stop_event')

  94.     def playback_status(self):
  95.         try:
  96.             return super(Player, self).playback_status()
  97.         except Exception as e:
  98.             print(e)
  99.             self.status = False

  100.     def quit(self):
  101.         super(Player, self).quit()
  102.         self.status = False


  103. if __name__ == "__main__":
  104.     print("OMXPlayer Running...")

  105. # 初始化TCPServer,来接收数据
  106.     import socket
  107.     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  108.     port = socket.getservbyname("http", "tcp")
  109.     s.connect(("www.126.com", port))
  110.     ip = s.getsockname()[0]
  111.     s.close()

  112.     server = socketserver.ThreadingTCPServer((ip, 8080), MyServer)
  113.     server_thread = threading.Thread(target=server.serve_forever)
  114.     server_thread.daemon = True
  115.     server_thread.start()

  116. # 初始化LED任务
  117.     led_thread = threading.Thread(target=led_run)
  118.     led_thread.daemon = True
  119.     led_thread.start()

  120. # 播放控制程序
  121.     print("wait...", ip)
  122.     player = None

  123.     # player = Player(Path(AUDIO_PATH + 'a9.mp3'))
  124.     #
  125.     # while True:
  126.     #     if player.status:
  127.     #         try:
  128.     #             print(player.playback_status())
  129.     #         except Exception as e:
  130.     #             print(e)
  131.     #         sleep(1)

  132.     while True:
  133.         cmd_update = None
  134.         while True:
  135.             if cmd_update is not None:
  136.                 break
  137.             else:
  138.                 if player is not None and player.status:
  139.                     try:
  140.                         player['current_time'] = player.position()
  141.                         player['playback_status'] = player.playback_status()
  142.                         print(' %s  %d  %d' % (player['playback_status'], player['total_time'], player['current_time']))
  143.                     except:pass
  144.                 else:
  145.                     play['playback_status'] = 'stop'
  146.                     play['current_time'] = 0
  147.             sleep(0.1)

  148.         print('cmd: ', cmd_update)
  149.         print('play: ', play)

  150.         if player is not None and player.status:
  151.             if cmd_update['control'] == 'volume':
  152.                 player.set_volume(play['volume'])
  153.                 continue


  154.         if player is not None:
  155.             player.quit()
  156.             player = None

  157.         if cmd_update['control'] == 'play':
  158.             playname = play['filename'].lower()
  159.             filepath = None
  160.             file_format = None
  161.             if '.mp3' in playname:
  162.                 filepath = Path(AUDIO_PATH + play['filename'])
  163.                 file_format = 'AUDIO'

  164.             elif '.mp4' in playname or '.avi' in playname or '.rmvb' in playname:
  165.                 filepath = Path(VIDEO_PATH + play['filename'])
  166.                 file_format = 'VIDEO'

  167.             if file_format is not None:
  168.                 if not os.path.exists(filepath):
  169.                     print(TAG, 'file is not exist ', filepath)
  170.                     filepath = Path('/mnt/usb_flash/' + play['filename'])
  171.                     if not os.path.exists(filepath):
  172.                         print(TAG, 'file is not exist ', filepath)
  173.                         filepath = None

  174.             if filepath is not None:
  175.                 player = Player(filepath)
  176.                 player.set_volume(play['volume'])
  177.                 play['total_time'] = player.metadata()['mpris:length']/1000000

复制代码


连接ssh运行程序:
pi@RPI0W:~ $ python3 ./python/player_server.py
OMXPlayer Running...
wait... 162.20.10.9

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-9-10 18:22:54 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-10 18:32 编辑

【】omxplayer.php
      使用PHP7.3, 程序会自动查找指定目录下的指定后缀的文件,并生成按钮,当点击按钮时,会通过SOCKET发送文件名给PY进行播放。可以在此基础扩展出更多有用的功能。附上代码
  1. <!DOCTYPE html>
  2. <html>
  3. <body>

  4. <?php
  5. //读取文件目录的文件,返回一个文件名数组
  6. function getAllFiles($filepath, $type_array){
  7.     $files = array();
  8.     if (is_dir ( $filepath )) //判断是不是目录
  9.     {
  10.         $dir_handle = opendir ( $filepath ); //打开文件夹的句柄
  11.         if ($dir_handle)
  12.         {
  13.             while ( ($filename = readdir ( $dir_handle ))!= false )
  14.             {
  15.                 if ($filename == "." or $filename == "..")
  16.                     continue;
  17.                 if ($filename[0] != ".")
  18.                     if ( is_file ( $filepath . "/" . $filename))
  19.                     {
  20.                         $type = substr ( $filename, strripos ( $filename, "." ) + 1 );

  21.                         if(array_search($type, $type_array) !== FALSE){
  22.                             array_push($files, $filename);
  23.                         }
  24.                     }
  25.             }
  26.             closedir ( $dir_handle );
  27.         }
  28.     }
  29.     return $files;
  30. }

  31. //使用SOCKET-TCP发送消息给python
  32. //'162.20.10.9'需要替换成树莓的正确静态IP
  33. function send_message($name){
  34.     $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  35.     $con=socket_connect($socket,'162.20.10.9',8080);
  36.     $d = (object)[];
  37.     $d->app = 'OMXPlayer';
  38.     if(!$con){
  39.         socket_close($socket);
  40.     }
  41.     else {
  42.         $d->control = 'play';
  43.         $d->filename = $name;

  44.         socket_write($socket, json_encode($d));
  45.         $hear = socket_read($socket, 1024);
  46.         sleep(1);

  47.         socket_shutdown($socket);
  48.         socket_close($socket);
  49.         return $hear;
  50.     }
  51.     return '{}';
  52. }

  53. define('MUSIC', ["mp3"]);
  54. define('VIDEO', ["mp4", "avi", "flv", "mkv"]);


  55. //以下文件目录需要替换成树莓正确的存放目录
  56. function getAudioFiles(){
  57.     return getAllFiles("/var/homeshare/DLNA/Music", MUSIC);
  58. }

  59. function getVideoFiles(){
  60.     return getAllFiles("/var/homeshare/DLNA/Video", VIDEO);
  61. }

  62. function getUSBDiskFiles(){
  63.     return getAllFiles("/media/pi/8G", VIDEO);
  64. }

  65. function createButtonList($namearrary){
  66.     for($n=0; $n<sizeof($namearrary); $n++){
  67.         $btn = "<input type="submit" name="submit" value="$namearrary[$n]"><br>";
  68.         echo $btn;
  69.     }
  70. }

  71. header("content-type:text/html;charset=utf-8");
  72. echo "<h2>OMXPlayer简易点播页面,请先开启player_service.py"."</h2><br>";
  73. echo "<form action="omxplayer.php" method="post">";
  74. echo "<h2>Music"."</h2><br>";
  75. $na = createButtonList(getAudioFiles());

  76. echo "<h2>Video"."</h2><br>";
  77. $na = createButtonList(getVideoFiles());

  78. echo "</form>";


  79. $file = $_POST['submit'];
  80. if(!empty($file)) {
  81.     echo '点播的是 : '.$file.'<br>';
  82.     send_message($file);
  83. }else{
  84.     echo '<br>-还没有点播-';
  85. }

  86. ?>

  87. </body>
  88. </html>
复制代码



然后在手机或电脑浏览器输入 : x.x.x.x(IP)/omxplayer.php , 就会显示点播页面,看图:



当然,如果你内力深厚,不怕麻烦,可以继续打造更加漂亮的页面。。。。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-9-24 08:06:18 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2019-9-24 10:23:24 | 显示全部楼层
谢谢分享。 挺好的资料。  

树莓派4 入手后,点亮屏幕了,不知道干嘛了。

出0入0汤圆

发表于 2019-9-24 10:53:20 | 显示全部楼层
你们玩官方的系统还是ubuntu啊? 哪个好用呢?

出0入0汤圆

 楼主| 发表于 2019-9-24 12:01:20 | 显示全部楼层
lghtjpu 发表于 2019-9-24 10:53
你们玩官方的系统还是ubuntu啊? 哪个好用呢?

用的是官方的系统,zero跑不动ubuntu

出0入0汤圆

 楼主| 发表于 2019-9-24 12:03:49 | 显示全部楼层
本帖最后由 leon...... 于 2019-9-24 12:05 编辑
lyg407 发表于 2019-9-24 10:23
谢谢分享。 挺好的资料。  

树莓派4 入手后,点亮屏幕了,不知道干嘛了。 ...


确实是这样,所以我就各种折腾了,之前还虚拟机跑了跑XP,卡得我都怀疑人生了。不过至少解决问题的过程是愉悦的,而且发现homekit似乎也可以玩玩。

加入各种传感器后,再连接python,然后自动化,这个不就是电工拿手的方式

出0入0汤圆

发表于 2019-9-24 13:05:12 | 显示全部楼层
leon...... 发表于 2019-9-24 12:03
确实是这样,所以我就各种折腾了,之前还虚拟机跑了跑XP,卡得我都怀疑人生了。不过至少解决问题的过程是 ...

使劲造。   生命不息,折腾不止。

持续关注帖子,一起学习新知识。

出0入0汤圆

发表于 2019-9-24 13:25:42 来自手机 | 显示全部楼层
我的pizerow安装了wukong-robot,还要啥智能音响

出0入0汤圆

发表于 2019-10-1 01:35:33 | 显示全部楼层
感谢楼主的分享!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-2 18:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表