[嘉楠 CanMV K230]测评 ③点灯及代码离线运行
<div class='showpostmsg'> 本帖最后由 不爱胡萝卜的仓鼠 于 2024-9-29 00:54 编辑<p> 上一篇我们尝试在线运行了一个demo,但是在实际应用场景中,代码都是离线运行的,今天我们就要来尝试让代码离线运行。</p>
<p> 由于脱离电脑,就没有办法通过USB数据线把摄像头的图像上传给电脑,我手上也没有屏幕,最终我选择最基础的点灯,通过运行点灯程序,就可以很直观的看到代码是否有离线运行成功</p>
<p> </p>
<p><strong><span style="font-size:24px;">一.点灯</span></strong></p>
<p> 点灯的本质就是控制GPIO的高低电平输出,那么先来看看原理图,LED灯连接到K230的那个GPIO上</p>
<div style="text-align: center;"></div>
<div style="text-align: center;"></div>
<p> 通过原理图可以看到,使用的是GPIO52</p>
<p> 点灯的写法很多,可以参照一下01studio的文档:<a href="https://wiki.01studio.cc/docs/canmv_k230/basic_examples/led" target="_blank">https://wiki.01studio.cc/docs/canmv_k230/basic_examples/led</a>。</p>
<p> 官方也提供了文档,关于点灯会可以用到以下2个文档:</p>
<p>1.pin模块:<a href="https://developer.canaan-creative.com/k230_canmv/main/zh/api/machine/K230_CanMV_Pin%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.html" target="_blank">https://developer.canaan-creative.com/k230_canmv/main/zh/api/machine/K230_CanMV_Pin%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.html</a></p>
<p>2.FPIOA模块:<a href="https://developer.canaan-creative.com/k230_canmv/main/zh/api/machine/K230_CanMV_FPIOA%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.html" target="_blank">https://developer.canaan-creative.com/k230_canmv/main/zh/api/machine/K230_CanMV_FPIOA%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.html</a></p>
<p> 其中FPIOA模块是用于指定这个引脚的功能,一个屋里引脚可以有多个功能,这个在单片机中很常见,他就可以对这个引脚的功能进行配置。而pin模块就是真正对GPIO进行控制使用的</p>
<p> </p>
<p> 事实上不用FPIOA模块也可以实现点灯,直接使用pin模块就可以。代码如下,以下代码实现了闪灯效果,间隔1s</p>
<pre>
<code class="language-python">from machine import Pin
import time
#初始化52号引脚为输出模式,不拉高,驱动能力为默认的7
LED = Pin(52, Pin.OUT, pull=Pin.PULL_NONE, drive=7)
while True:
#开灯
LED.value(1)
time.sleep(1)
#关灯
LED.value(0)
time.sleep(1)</code></pre>
<p> 效果如下</p>
<p>23f6e66703e85a782dd2d3960fbd0e2c<br />
</p>
<p> </p>
<p><strong><span style="font-size:24px;">二.离线运行代码</span></strong></p>
<p> LED灯闪烁的代码已经准备好了,接下来就可以让代码离线运行了。操作非常简单,只需要把代码的py文件保存到SD卡中即可。</p>
<p> K230在USB连接后,直接可以在电脑上看到对应的盘符,名字叫CanMV,就可以直接保存文件了</p>
<div style="text-align: center;"></div>
<p> </p>
<p> 在CanMV中,有2个盘,一个是data,一个是sdcard </p>
<div style="text-align: center;"></div>
<p> 回头我们的代码就要放到sdcard中,现在的sdcard中文件如下</p>
<div style="text-align: center;"></div>
<p> 上电默认运行的文件规则如下:</p>
<ul>
<li>
<p>boot.py: <strong>上电第1个运行的脚本,如果代码有while True阻塞,将不会运行下面的main.py。</strong></p>
</li>
<li>
<p>main.py:<strong>上电第2个运行的脚本。</strong></p>
</li>
</ul>
<p> </p>
<p><strong><span style="font-size:20px;">1.手动保存</span></strong></p>
<p>那么只需要放一个名字叫boot.py的文件或者main.py就可以了,先试着放一个boot.py,里面内容就是我们刚才的代码</p>
<div style="text-align: center;"></div>
<p> 断电后,再上电,代码成功运行</p>
<p> 59fe380341657df394159f0932ca2ac7</p>
<p> </p>
<p><strong><span style="font-size:20px;">2.IDE自动保存</span></strong></p>
<p> 手动复制文件很麻烦,IDE中还提供了一键保存的方案。不过这个方法有一点需要注意,就是他是以main.py的名称保存的,那么按照刚才我们说的boot和mian的规则,你的sdcard路径下不能有boot.py,或者boot.py运行后main.py要能运行(也就是不能有while1循环阻塞,boot文件要有结束)。否则你下载进去的代码就没机会被执行了</p>
<p> </p>
<p> 为了回头能区别出来两次保存的文件,我就把时间从1s改成了0.5s</p>
<p> </p>
<p> 操作方法很简单,如下所示</p>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p> </p>
</div>
<p>这个点击是或否都行,我选择了否,不然注释就没了</p>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p style="text-align: left;">等待保存 </p>
<div style="text-align: center;"></div>
<p> </p>
</div>
<p>保存成功</p>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p> </p>
</div>
<p>sdcard路径下就有main.py了</p>
<div style="text-align: center;">
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p> </p>
</div>
</div>
<p> 现在我们不删除boot,让两个文件都在,看看是不是和之前说的一样,如果一样的话,这次上电就会一直运行boot,1s一次闪灯。</p>
<p> 效果如下,确实还是1s间隔,和我们的预期一样</p>
<p>a96c4a0647db62b63825f06b6f009a3e<br />
</p>
<p> 然后我们把boot删除</p>
<div style="text-align: center;"></div>
<p> 此时再重新上电就会运行main了,会看到0.5s间隔的闪灯,效果如下,和我们的预期一致</p>
<p>fa2e049acdc1ad0ba2c90d002546320f<br />
</p>
<p> </p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页:
[1]