文章目录
Atlas智能小车部署
制卡
硬件准备
SD卡(建议64G)、读卡器、已在虚拟机中安装ubuntu-18.04桌面操作系统的PC机
软件准备
ubuntu-18.04.xx-server-arm64.iso
A200dk-npu-driver-{software version}-ubuntu18.04-aarch64-minirc.tar.gz
操作步骤
-
将装入SD卡的读卡器与用户PC机的USB接口连接。
-
在用户PC机中执行如下命令安装qemu-user-static、binfmt-support、yaml、squashfs-tools与交叉编译器。
切换为root用户
su - root
执行如下命令更新源
apt-get update
执行如下命令安装相关python依赖
pip3 install pyyaml
apt-get install qemu-user-static binfmt-support python3-yaml squashfs-tools gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
-
在用户PC机中以root用户执行如下命令创建制卡工作目录。
mkdir $HOME/mksd
-
将软件包准备中的Ubuntu服务器操作系统镜像包、开发者板驱动包上传到制卡工作目录中(“$HOME/mksd”)。
-
在制卡工作目录下(“$HOME/mksd”)执行如下命令获取制卡脚本。
-
下载制卡入口脚本“make_sd_card.py”
wget https://gitee.com/ascend/tools/raw/master/makesd/generic_script/make_sd_card.py
-
下载制作SD卡操作系统的脚本“make_ubuntu_sd.sh”
wget https://gitee.com/ascend/tools/raw/master/makesd/generic_script/make_ubuntu_sd.sh
-
-
执行制卡脚本。
-
以root用户执行如下命令查找SD卡所在的USB设备名称。
fdisk -l
例如,SD卡所在USB设备名称为“/dev/sda”,可通过插拔SD卡的方式确定设备名称。
-
运行SD制卡脚本“make_sd_card.py”
python3 make_sd_card.py local /dev/sda
- “local”表示使用本地方式制作SD卡。
- “/dev/sda”为SD卡所在的USB设备名称。
如图1所示表示制卡成功。
图1 SD制卡回显信息示例
-
-
制卡成功后,将SD卡从读卡器取出并插入Atlas 200 DK开发者板卡槽。待开发板四个灯亮起后开发板正常启动。(注:首次启动开发板的灯可能会闪烁,这是可能是开发板在升级系统,等待一会儿四个灯就常亮了)
配置网络(网络共享方式)
共享PC机网络方式配置示例
-
分别使用USB连接线及网线将Atlas 200 DK与PC机连接。
PC机中的“网络连接”显示如下图所示:
图3 网络连接图示
- “Local connection(本地连接) ”:USB虚拟网卡,此连接为基本连接,用于从PC侧SSH登录到Atlas 200 DK。
- “Ethernet2(以太网2)”:通过网线连接Atlas 200 DK的NIC网卡,后续将使用此网卡作为网关,用于Atlas 200 DK接入互联网。
说明:以上名字仅为示例,您可以通过拔插网口的方式查看连接Atlas 200 DK的是哪一个网卡。
-
在PC机上配置USB虚拟网卡,使其可以通过SSH方式登录Atlas 200 DK。
配置USB虚拟网卡的IP地址,IP地址需要与Atlas 200 DK的USB网卡的默认IP地址在同一网段。
Atlas 200 DK的USB网卡默认IP为“192.168.1.2”,例如配置PC机的USB虚拟网卡的IP地址为“192.168.1.101”,如下图所示:
图4 修改PC机侧USB虚拟网卡IP地址示例
配置完成后,执行如下命令测试下是否能够登录到Atlas 200 DK:
ssh HwHiAiUser@192.168.1.2
-
配置Atlas 200 DK的eth0网卡的网关。
Atlas 200 DK中eth0网卡的网关与eth0 IP地址在同一网段即可,例如Atlas 200 DK的eth0的默认IP地址为“192.168.0.2”,则此处可以配置eth0的网关为“192.168.0.101”。
**说明:**Atlas 200 DK通过网络共享接入网络的方式,数据走eth0,然后通过网关访问网络,所以需要确保eth0的IP地址能够访问网关。
配置方式如下:
-
在PC机上以SSH方式登录Atlas 200 DK。
ssh HwHiAiUser@192.168.1.2
-
切换到root用户。
su - root
-
配置eth0的网关地址。
vi /etc/netplan/01-netcfg.yaml
配置示例如下图所示:
Atlas 200 DK eth0网关配置
保存退出。按 esc
:wq!
注:域名服务器可以配置为公共DNS“114.114.114.114”或者“8.8.8.8”,请根据实际环境进行选择配置。
-
-
在PC侧进行网络配置,将网络共享给Atlas 200 DK。
-
将PC机上能够接入互联网的网卡进行网络共享配置,共享给连接Atlas 200 DK的网卡。
如[图3](javascript:;)所示,能够接入互联网的网卡为“Ethernet”,连接Atlas 200 DK的网卡为“Ethernet2”。
右键单击网卡“Ethernet”,然后选择“Properties > Sharing”,按照下图所示进行配置。
图6 共享网络配置
-
单击“OK”,保存配置。
-
修改“Ethernet2”的IP地址为Atlas 200 DK eth0网关的IP地址(例如,
图5
中配置的“192.168.0.101”)。
修改方法如下图所示,至此,您的Atlas 200 DK已可以接入互联网。
Ethernet2 IP地址修改
-
安装OS依赖
将用户添加到sudo组
方法一(临时有效):
usermod -a -G sudo HwHiAiUser
方法二(永久有效):
修改 /etc/sudoers
文件
cd /etc/sudoers
目录下
由于sudoers文件为只读权限,所以需要添加写入权限
chmod u+w sudoers
vim sudoers
找到 root ALL = (ALL) ALL 这一行,在其下一行加入 HwHiAiUser ALL = (ALL) ALL
保存退出
:wq!
把sudoers文件的权限修改回来
chmod u-w sudoers
更换开发板镜像源
执行以下换源操作
sudo wget -O /etc/apt/sources.list https://repo.huaweicloud.com/repository/conf/Ubuntu-Ports-bionic.list --no-check-certificate
更新源
sudo apt-get update
安装依赖
-
执行
sudo apt-get install -y gcc g++ make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3 libopenblas-dev
-
检查系统是否安装满足版本要求的python开发环境。
在当前安装用户下执行命令
python3 --version
。- 如果返回信息满足python版本要求(3.7.0~ 3.7.11),则直接进入步骤3。
- 如果返回信息不满足满足python版本要求(3.7.0~ 3.7.11):
- 当环境上root用户下已安装满足要求的python版本(3.7.0~ 3.7.11)时,如果当前安装用户需要复用该python,则可以直接参考[设置python3.7.5环境变量](javascript:;)配置环境变量。
- 当环境上未安装满足要求的python版本(3.7.0~ 3.7.11)时,则可以参考如下步骤安装python。
-
使用wget下载python3.7.5源码包,可以下载到安装环境的任意目录,命令为:
wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz
-
进入下载后的目录,解压源码包,命令为:
tar -zxvf Python-3.7.5.tgz
-
进入解压后的文件夹,执行配置、编译和安装命令:
cd Python-3.7.5 ./configure --prefix=/usr/local/python3.7.5 --enable-loadable-sqlite-extensions --enable-shared make sudo make install
其中“–prefix”参数用于指定python安装路径,用户根据实际情况进行修改。“–enable-shared”参数用于编译出libpython3.7m.so.1.0动态库。“–enable-loadable-sqlite-extensions”参数用于加载libsqlite3-dev依赖。
本手册以–prefix=/usr/local/python3.7.5路径为例进行说明。执行配置、编译和安装命令后,安装包在/usr/local/python3.7.5路径,libpython3.7m.so.1.0动态库在/usr/local/python3.7.5/lib/libpython3.7m.so.1.0路径。
-
设置python3.7.5环境变量。
#用于设置python3.7.5库文件路径 export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH #如果用户环境存在多个python3版本,则指定使用python3.7.5版本 export PATH=/usr/local/python3.7.5/bin:$PATH
通过以上export方式设置环境变量,该种方式设置的环境变量只在当前窗口有效。您也可以通过将以上命令写入~/.bashrc文件中,然后执行**source /.bashrc**命令,使上述环境变量永久生效。注意如果后续您有使用环境上其他python版本的需求,则不建议将以上命令写入到/.bashrc文件中。
-
安装完成之后,执行如下命令查看安装版本,如果返回相关版本信息,则说明安装成功。
python3 --version pip3 --version
-
安装前请先使用
pip3 list
命令检查是否安装相关依赖,若已经安装,则请跳过该步骤;若未安装,则安装命令如下(如果只有部分软件未安装,则如下命令修改为只安装还未安装的软件即可)。- 请在安装前配置好pip源,具体可参考配置pip源。
- 安装前,建议执行命令pip3 install --upgrade pip进行升级,避免因pip版本过低导致安装失败。
- 如下命令如果使用非root用户安装,需要在安装命令后加上**–user**,例如:pip3 install attrs **–user,**安装命令可在任意路径下执行。
- 要求numpy版本大于等于1.14.3,如下命令以安装numpy 1.17.2为例。
pip3 install attrs pip3 install numpy==1.17.2 pip3 install decorator pip3 install sympy pip3 install cffi pip3 install pyyaml pip3 install pathlib2 pip3 install psutil pip3 install protobuf pip3 install scipy pip3 install requests
如果执行上述命令时报错“subprocess.CalledProcessError:Command ‘(‘lsb_release’, ‘-a’)’ return non-zero exit status 1”,请参见pip3 install报错“subprocess.CalledProcessError:Command ‘(‘lsb_release’, ‘-a’)’ return non-zero exit status 1”。
安装CANN软件(开发环境与运行环境合设)
-
准备软件包。
请参见下载链接下载配套驱动版本的开发套件包“Ascend-cann-toolkit_{version}_linux-aarch64.run”。
驱动与CANN版本的配套关系请参见版本配套说明(Gitee)
-
安装开发套件包。
-
以HwHiAiUser用户将开发套件包上传到开发板 /home/HwHiAiUser 目录,进入该目录。
-
执行如下命令为安装包增加可执行权限。
chmod +x \*.run
-
执行如下校验安装包的一致性和完整性。
./Ascend-cann-toolkit_\*{version}\*_linux-aarch64.run --check
-
执行如下命令进行Toolkit软件包的安装。
./Ascend-cann-toolkit_\*{version}\*_linux-aarch64.run --install --chip=Ascend310-minirc
以上命令为使用默认路径进行安装的示例,默认安装路径为“$HOME/Ascend”。
-
-
配置环境变量
-
配置环境变量。
CANN软件提供进程级环境变量设置脚本,供用户在进程中引用,以自动完成环境变量设置。用户进程结束后自动失效。示例如下(以HwHiAiUser用户默认安装路径为例):
. /home/HwHiAiUser/Ascend/ascend-toolkit/set_env.sh
用户也可以通过修改~/.bashrc文件方式设置永久环境变量,操作如下:
- 以运行用户在任意目录下执行
vi ~/.bashrc
命令,打开 .bashrc 文件,在文件最后一行后面添加上述内容。 - 执行
:wq!
命令保存文件并退出。 - 执行
source ~/.bashrc
命令使其立即生效。
- 以运行用户在任意目录下执行
-
安装ROS
-
设置源文件
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
-
设置密钥
sudo apt install curl
# 如果你没有安装 curl 执行这一步curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
-
安装步骤
更新源
sudo apt update
安装ROS
sudo apt install ros-melodic-desktop-full
-
环境设置
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc
-
构建包的依赖
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
初始化 rosdep
sudo apt install python-rosdep sudo rosdep init rosdep update
安装其他第三方依赖
昇腾AI设备安装开发环境,同时作为运行环境场景下的第三方依赖安装
以下步骤以普通用户HwHiAiUser安装
安装准备
请执行以下命令进行安装准备
# 以安装用户在任意目录下执行以下命令,打开.bashrc文件。
vi ~/.bashrc
# 在文件最后一行后面添加如下内容。
export CPU_ARCH=`arch`
export THIRDPART_PATH=${HOME}/Ascend/thirdpart/${CPU_ARCH} #代码编译时链接第三方库
export LD_LIBRARY_PATH=${HOME}/Ascend/thirdpart/${CPU_ARCH}/lib:$LD_LIBRARY_PATH #运行时链接库文件
export INSTALL_DIR=${HOME}/Ascend/ascend-toolkit/latest #CANN软件安装后文件存储路径
# 执行命令保存文件并退出。
:wq!
# 执行命令使其立即生效。
source ~/.bashrc
# 创建第三方依赖文件夹
mkdir -p ${THIRDPART_PATH}
# 下载源码并安装git
cd ${HOME}
sudo apt-get install git
git clone https://gitee.com/ascend/samples.git
# 拷贝公共文件到第三方路径中
cp -r ${HOME}/samples/common ${THIRDPART_PATH}
如果是200DK场景还需要执行以下命令拷贝media_mini等so文件以及相关头文件,满足摄像头样例编译需要。
mkdir -p ${INSTALL_DIR}/driver
cp /usr/lib64/libmedia_mini.so ${INSTALL_DIR}/driver/
cp /usr/lib64/libslog.so ${INSTALL_DIR}/driver/
cp /usr/lib64/libc_sec.so ${INSTALL_DIR}/driver/
cp /usr/lib64/libmmpa.so ${INSTALL_DIR}/driver/
cp /usr/local/Ascend/include/peripheral_api.h ${INSTALL_DIR}/driver/
安装过程
安装opencv
执行以下命令安装opencv,如果代码中并没有使用opencv相关功能及函数,可以跳过此步骤。
sudo apt-get install libopencv-dev
安装ffmpeg+acllite库
执行以下命令源码安装ffmpeg(apt安装的ffmpeg版本较低,所以源码安装)并安装acllite。如果代码中并没有使用acllite库相关功能及函数,可以跳过此步骤。
# 下载ffmpeg
cd ${HOME}
wget http://www.ffmpeg.org/releases/ffmpeg-4.1.3.tar.gz --no-check-certificate
tar -zxvf ffmpeg-4.1.3.tar.gz
cd ffmpeg-4.1.3
# 安装ffmpeg
./configure --enable-shared --enable-pic --enable-static --disable-x86asm --prefix=${THIRDPART_PATH}
make -j8
make install
# 编译并安装acllite
cd ${HOME}/samples/cplusplus/common/acllite/
make
make install
安装presentagent
执行以下命令源码安装protobuf及presentagent。如果代码中并没有使用presentagent相关功能及函数,可以跳过此步骤。
开始安装protobuf及presentagent。
# 安装protobuf相关依赖
sudo apt-get install autoconf automake libtool
# 下载protobuf源码
cd ${HOME}
git clone -b 3.13.x https://gitee.com/mirrors/protobufsource.git protobuf
# 编译安装protobuf
cd protobuf
./autogen.sh
./configure --prefix=${THIRDPART_PATH}
make clean
make -j8
sudo make install
# 进入presentagent源码目录并编译
cd ${HOME}/samples/cplusplus/common/presenteragent/proto
${THIRDPART_PATH}/bin/protoc presenter_message.proto --cpp_out=./
# 开始编译presentagnet
cd ..
make -j8
make install
小车样例运行
前提条件
- 已完成对应产品的开发环境和运行环境安装。(以上步骤都完成即可)
- 完整的小车,包含各个小车部件,电池,路由器,显示屏,摄像头等都已经正确安装。
软件准备
-
获取源码包。(如果第一次使用这个方法要将开发板的密钥添加到你的 gitee 账号上)
可以使用以下两种方式下载,请选择其中一种进行源码准备。
-
命令行方式下载(下载时间较长,但步骤简单)。
开发环境,非root用户命令行中执行以下命令下载源码仓。
cd $HOME
git clone https://gitee.com/ascend/samples.git
-
压缩包方式下载(下载时间较短,但步骤稍微复杂)。
- samples仓右上角选择 克隆/下载 下拉框并选择 下载ZIP。
- 将ZIP包上传到开发环境中的普通用户家目录中,例如 $HOME/ascend-samples-master.zip。
- 开发环境中,执行以下命令,解压zip包。
-
cd $HOME
unzip ascend-samples-master.zip
-
获取此应用中所需要的原始网络模型。
参考下表获取此应用中所用到的原始网络模型及其对应的权重文件,并将其存放到开发环境普通用户下目录:$HOME/samples/cplusplus/contrib/Ascbot。
模型名称 模型说明 collision_avoidance_model 检测小车前方是否有跌落危险 road_following_model 检测车道线,实现循道行驶 road_object_detection_deploy 检测小车前方物体 -
部署模型
cd $HOME/samples/cplusplus/contrib/Ascbot/model
获取 collision_avoidance_model 模型
wget https://gitee.com/link?target=https%3A%2F%2Fmodelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com%2F003_Atc_Models%2FAE%2FATC%2520Model%2Fcar%2Fcollision%2Fcollision_avoidance_model.om
获取 road_following_model 模型
wget https://gitee.com/link?target=https%3A%2F%2Fmodelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com%2F003_Atc_Models%2FAE%2FATC%2520Model%2Fcar%2Ffollowing%2Froad_following_model.om
获取 road_object_detection_deploy 模型
wget https://gitee.com/link?target=https%3A%2F%2Fmodelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com%2F003_Atc_Models%2FAE%2FATC%2520Model%2Fcar%2Fobject_detection%2Froad_object_detection_deploy.om
设置LD_LIBRARY_PATH环境变量。
由于LD_LIBRARY_PATH环境变量在转使用atc工具和运行样例时会产生冲突,所以需要在命令行单独设置此环境变量,方便修改。
export install_path=$HOME/Ascend/ascend-toolkit/latest export LD_LIBRARY_PATH=\\${install_path}/atc/lib64
样例部署
- 开发环境命令行中设置编译依赖的环境变量。
export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest/arm64-linux:$DDK_PATH
export NPU_HOST_LIB=$DDK_PATH/acllib/lib64/stub:${install_path}/arm64-linux/acllib/lib64/stub:$NPU_HOST_LIB
- 切换到ascbot_c75目录,创建目录用于存放编译文件,例如,本文中,创建的目录为 build/intermediates/host。
cd $HOME/samples/cplusplus/contrib/Ascbot
mkdir -p build/intermediates/host
- 切换到 build/intermediates/host 目录,执行 cmake 生成编译文件。
cd build/intermediates/host
make clean
cmake ../../../src -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_SKIP_RPATH=TRUE**
-
执行make命令
make
样例运行
-
设置环境
切换为 root
su - root
执行如下命令
vim /etc/rc.local
添加以下指令
echo 504 >/sys/class/gpio/export
echo 444 >/sys/class/gpio/export
chown -R HwHiAiUser /sys/class/gpio/gpio444
chown -R HwHiAiUser /sys/class/gpio/gpio504
chown -R HwHiAiUser /sys/class/gpio/gpio444/direction
chown -R HwHiAiUser /sys/class/gpio/gpio504/direction
chown -R HwHiAiUser /sys/class/gpio/gpio444/value
chown -R HwHiAiUser /sys/class/gpio/gpio504/value
chown -R HwHiAiUser /dev/i2c-1
chown -R HwHiAiUser /dev/i2c-2
chown -R HwHiAiUser /dev/ttyAMA0
usermod -aG HwHiAiUser HwHiAiUser
-
运行可执行文件。
cd $HOME/samples/cplusplus/contrib/Ascbot/out
切换目录后,执行以下命令运行样例。
./main Channel-0
查看结果
运行完成后,可下载手机端应用控制小车运行。 手机端下载地址
2025年3月24日,更新补充
FQA
电机驱动板相关的问题及解决
- 这一步可以说是花费时间最久的一步了,之前就试着完全跟着昇腾小姐姐安装和部署小车但是怎么都不成功,总感觉有点匪夷所思,一度怀疑是不是atlas开发板的那几个GPIO口有问题,或是电机驱动板坏掉了之类的,甚至一度开始怀疑人生🤣。但是事情的转机出现在了一天早上,我想了想应该是开发板没有和驱动板正确通信,想找一下这块驱动板的开发指南和使用手册这类的(其实这应该是嵌入式开发人员的必备的素质——找对应设备的官方开发文档)。在这个网址找到驱动板的信息之后,我看到了一个叫从设备的概念,对应到代码里面是
slave_addr
的变量。手册里面说“I2C设备地址设置范围为:0x40到0x5F”,但是代码里面对应的slave_addr
值却为0x60,好家伙原来是这个幺蛾子,然后我照着手册的说明根据我的驱动板算出slave_addr
应该设为0x40,终于可以通信了! - 通信成功手机端发送的指令开发板和驱动板都收到了,但是小车的电机就是不动,事情又开始匪夷所思起来了。好吧不想再写了,最后我是在这里解决的。应为源代码中wheel.cpp文件对应的是一个公司自己小车的驱动板,而我们自己弄的小车则需要将wheel.cpp换为适配了HAT驱动板的那一个。具体如下:(教程里面没说这一点直接就拿那个源码编译运行真是误导别人,害我浪费了好多时间!)
- 详细代码
/**
* @file wheel.cpp
*/
#include <memory>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <errno.h>
#include <string.h>
#include "wheel.h"
const unsigned char slave_addr = 0x40;
const unsigned char stop[70] = {0x00,0x04,0xe2,0xe4,0xe8,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,
0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,
0x00,0x10,0x00,0x00,0x00,0x10};
wheel::wheel(void)
{
}
wheel::~wheel(void)
{
}
int wheel::wheel_init(void)
{
printf("zhimins wheel init\n");
for(unsigned char i=0;i<70;i++)
{
if(i2c_ctrl.atlas_i2c_write(slave_addr,i,stop[i])!=0)
{
break;
}
}
return 0;
}
int wheel::wheel_left_move(int direction,unsigned char speed)
{
unsigned short value = speed*80;
printf("zhimins wheel left move\n");
if(direction == 1)
{
i2c_ctrl.atlas_i2c_write(slave_addr,0x0c,0x00);
i2c_ctrl.atlas_i2c_write(slave_addr,0x0d,0x00);
i2c_ctrl.atlas_i2c_write(slave_addr,0x10,value&0xff);
i2c_ctrl.atlas_i2c_write(slave_addr,0x11,value>>8);
}
else if(direction == -1)
{
i2c_ctrl.atlas_i2c_write(slave_addr,0x0c,value&0xff);
i2c_ctrl.atlas_i2c_write(slave_addr,0x0d,value>>8);
i2c_ctrl.atlas_i2c_write(slave_addr,0x10,0x00);
i2c_ctrl.atlas_i2c_write(slave_addr,0x11,0x00);
}
if(speed == 0)
{
i2c_ctrl.atlas_i2c_write(slave_addr,0x08,0x00);
i2c_ctrl.atlas_i2c_write(slave_addr,0x09,0x00);
}
else
{
i2c_ctrl.atlas_i2c_write(slave_addr,0x08,0xa0);
i2c_ctrl.atlas_i2c_write(slave_addr,0x09,0x0f);
}
return 0;
}
int wheel::wheel_right_move(int direction,unsigned char speed)
{
unsigned short value = speed*80 ;
printf("zhimins wheel right move\n");
if(direction == 1)
{
i2c_ctrl.atlas_i2c_write(slave_addr,0x14,0x00);
i2c_ctrl.atlas_i2c_write(slave_addr,0x15,0x00);
i2c_ctrl.atlas_i2c_write(slave_addr,0x18,value&0xff);
i2c_ctrl.atlas_i2c_write(slave_addr,0x19,value>>8);
}
else if(direction == -1)
{
i2c_ctrl.atlas_i2c_write(slave_addr,0x14,value&0xff);
i2c_ctrl.atlas_i2c_write(slave_addr,0x15,value>>8);
i2c_ctrl.atlas_i2c_write(slave_addr,0x18,0x00);
i2c_ctrl.atlas_i2c_write(slave_addr,0x19,0x00);
}
if(speed == 0)
{
i2c_ctrl.atlas_i2c_write(slave_addr,0x1c,0x00);
i2c_ctrl.atlas_i2c_write(slave_addr,0x1d,0x00);
}
else
{
i2c_ctrl.atlas_i2c_write(slave_addr,0x1c,0xa0);
i2c_ctrl.atlas_i2c_write(slave_addr,0x1d,0x0f);
}
return 0;
}
摄像头相关的问题及解决
-
红外摄像头:
起初我使用的是一款红外摄像头,通过运行samples下面的摄像头实例看到该摄像头拍摄的画面为黑白色。过了一段时间之后我又回过头来想试着运行摄像头实例时就怎么都看不到摄像头的画面,同时拍照也拍不了。但是摄像头是确确实实通电了,因为摄像头的两个红外灯都有发出热量。
-
树莓派摄像头:折腾红外摄像头无果后,就老老实实地按照清单去淘宝上面买树莓派摄像头了。买来长这样:
摄像头和主板是可分离的,到手的时候摄像头背面有一张贴纸,撕掉后可以将摄像头黏在主板上,不知道是不是因为我刚开始没有将摄像头背面的贴纸撕掉,在运行摄像头实例的时候总是说找不到摄像头,我一度认为可能是驱动的问题,还找了半天的帖子。然后我突然不知道为什么想开了把摄像头后面的贴纸撕掉把摄像头贴到主板上的对应框框里面,运行一下拍照样例就突然成功了。