<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
		<id>http:///https//wiki.microduino.cn/index.php?action=history&amp;feed=atom&amp;title=MicroMV_%E8%B7%9F%E9%9A%8F%E6%9C%BA%E5%99%A8%E4%BA%BA</id>
		<title>MicroMV 跟随机器人 - 版本历史</title>
		<link rel="self" type="application/atom+xml" href="http:///https//wiki.microduino.cn/index.php?action=history&amp;feed=atom&amp;title=MicroMV_%E8%B7%9F%E9%9A%8F%E6%9C%BA%E5%99%A8%E4%BA%BA"/>
		<link rel="alternate" type="text/html" href="https//wiki.microduino.cn/index.php?title=MicroMV_%E8%B7%9F%E9%9A%8F%E6%9C%BA%E5%99%A8%E4%BA%BA&amp;action=history"/>
		<updated>2026-04-21T07:13:31Z</updated>
		<subtitle>本wiki的该页面的版本历史</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https//wiki.microduino.cn/index.php?title=MicroMV_%E8%B7%9F%E9%9A%8F%E6%9C%BA%E5%99%A8%E4%BA%BA&amp;diff=26837&amp;oldid=prev</id>
		<title>2018年12月7日 (五) 03:47 502748957@qq.com</title>
		<link rel="alternate" type="text/html" href="https//wiki.microduino.cn/index.php?title=MicroMV_%E8%B7%9F%E9%9A%8F%E6%9C%BA%E5%99%A8%E4%BA%BA&amp;diff=26837&amp;oldid=prev"/>
				<updated>2018-12-07T03:47:12Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;zh-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;2018年12月7日 (五) 03:47的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l161&quot; &gt;第161行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第161行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;MicroMV目录&lt;/del&gt;|返回MicroMV目录页面]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;MicroMV 简介&lt;/ins&gt;|返回MicroMV目录页面]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>502748957@qq.com</name></author>	</entry>

	<entry>
		<id>https//wiki.microduino.cn/index.php?title=MicroMV_%E8%B7%9F%E9%9A%8F%E6%9C%BA%E5%99%A8%E4%BA%BA&amp;diff=26082&amp;oldid=prev</id>
		<title>2018年5月16日 (三) 09:53 Radiumray9@gmail.com</title>
		<link rel="alternate" type="text/html" href="https//wiki.microduino.cn/index.php?title=MicroMV_%E8%B7%9F%E9%9A%8F%E6%9C%BA%E5%99%A8%E4%BA%BA&amp;diff=26082&amp;oldid=prev"/>
				<updated>2018-05-16T09:53:52Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;zh-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;2018年5月16日 (三) 09:53的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l158&quot; &gt;第158行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第158行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[MicroMV目录|返回MicroMV目录页面]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Radiumray9@gmail.com</name></author>	</entry>

	<entry>
		<id>https//wiki.microduino.cn/index.php?title=MicroMV_%E8%B7%9F%E9%9A%8F%E6%9C%BA%E5%99%A8%E4%BA%BA&amp;diff=25823&amp;oldid=prev</id>
		<title>Radiumray9@gmail.com：创建页面，内容为“=='''基本原理'''== *MicroMV捕捉人脸获取人脸坐标 *通过pid.py算法计算出舵机将要转动的角度，并通过串口发送给microduino *microduin…”</title>
		<link rel="alternate" type="text/html" href="https//wiki.microduino.cn/index.php?title=MicroMV_%E8%B7%9F%E9%9A%8F%E6%9C%BA%E5%99%A8%E4%BA%BA&amp;diff=25823&amp;oldid=prev"/>
				<updated>2018-05-16T05:22:08Z</updated>
		
		<summary type="html">&lt;p&gt;创建页面，内容为“==&amp;#039;&amp;#039;&amp;#039;基本原理&amp;#039;&amp;#039;&amp;#039;== *MicroMV捕捉人脸获取人脸坐标 *通过pid.py算法计算出舵机将要转动的角度，并通过串口发送给microduino *microduin…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=='''基本原理'''==&lt;br /&gt;
*MicroMV捕捉人脸获取人脸坐标&lt;br /&gt;
*通过pid.py算法计算出舵机将要转动的角度，并通过串口发送给microduino&lt;br /&gt;
*microduino接收数据后控制舵机&lt;br /&gt;
&lt;br /&gt;
=='''MicroMV的代码准备'''==&lt;br /&gt;
把pid.py复制到MicroMV生成的U盘空间中&amp;lt;br /&amp;gt;&lt;br /&gt;
pid.py:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;py&amp;quot;&amp;gt;&lt;br /&gt;
from pyb import millis&lt;br /&gt;
from math import pi, isnan&lt;br /&gt;
class PID:&lt;br /&gt;
    _kp = _ki = _kd = _integrator = _imax = 0&lt;br /&gt;
    _last_error = _last_derivative = _last_t = 0&lt;br /&gt;
    _RC = 1/(2 * pi * 20)&lt;br /&gt;
    def __init__(self, p=0, i=0, d=0, imax=0):&lt;br /&gt;
        self._kp = float(p)&lt;br /&gt;
        self._ki = float(i)&lt;br /&gt;
        self._kd = float(d)&lt;br /&gt;
        self._imax = abs(imax)&lt;br /&gt;
        self._last_derivative = float('nan')&lt;br /&gt;
&lt;br /&gt;
    def get_pid(self, error, scaler):&lt;br /&gt;
        tnow = millis()&lt;br /&gt;
        dt = tnow - self._last_t&lt;br /&gt;
        output = 0&lt;br /&gt;
        if self._last_t == 0 or dt &amp;gt; 1000:&lt;br /&gt;
            dt = 0&lt;br /&gt;
            self.reset_I()&lt;br /&gt;
        self._last_t = tnow&lt;br /&gt;
        delta_time = float(dt) / float(1000)&lt;br /&gt;
        output += error * self._kp&lt;br /&gt;
        if abs(self._kd) &amp;gt; 0 and dt &amp;gt; 0:&lt;br /&gt;
            if isnan(self._last_derivative):&lt;br /&gt;
                derivative = 0&lt;br /&gt;
                self._last_derivative = 0&lt;br /&gt;
            else:&lt;br /&gt;
                derivative = (error - self._last_error) / delta_time&lt;br /&gt;
            derivative = self._last_derivative + \&lt;br /&gt;
                                     ((delta_time / (self._RC + delta_time)) * \&lt;br /&gt;
                                        (derivative - self._last_derivative))&lt;br /&gt;
            self._last_error = error&lt;br /&gt;
            self._last_derivative = derivative&lt;br /&gt;
            output += self._kd * derivative&lt;br /&gt;
        output *= scaler&lt;br /&gt;
        if abs(self._ki) &amp;gt; 0 and dt &amp;gt; 0:&lt;br /&gt;
            self._integrator += (error * self._ki) * scaler * delta_time&lt;br /&gt;
            if self._integrator &amp;lt; -self._imax: self._integrator = -self._imax&lt;br /&gt;
            elif self._integrator &amp;gt; self._imax: self._integrator = self._imax&lt;br /&gt;
            output += self._integrator&lt;br /&gt;
        return output&lt;br /&gt;
    def reset_I(self):&lt;br /&gt;
        self._integrator = 0&lt;br /&gt;
        self._last_derivative = float('nan')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
把face_detection1024.py替换到MicroMV生成的U盘空间中的main.py做为主程序&amp;lt;br /&amp;gt;&lt;br /&gt;
face_detection1024.py:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;py&amp;quot;&amp;gt;&lt;br /&gt;
import sensor, time, image&lt;br /&gt;
from pyb import UART&lt;br /&gt;
from pid import PID&lt;br /&gt;
from pyb import LED&lt;br /&gt;
import json&lt;br /&gt;
red_led   = LED(1)&lt;br /&gt;
green_led = LED(2)&lt;br /&gt;
blue_led  = LED(3)&lt;br /&gt;
ir_led    = LED(4)&lt;br /&gt;
pan_pid = PID(p=0.42, i=0.01, imax=90)&lt;br /&gt;
tilt_pid = PID(p=0.22, i=0.005, imax=90)&lt;br /&gt;
pan_servo_pos=90&lt;br /&gt;
tilt_servo_pos=90&lt;br /&gt;
pan_center = 60&lt;br /&gt;
tilt_center = 40&lt;br /&gt;
# Reset sensor&lt;br /&gt;
sensor.reset()&lt;br /&gt;
# Sensor settings&lt;br /&gt;
sensor.set_contrast(1)&lt;br /&gt;
sensor.set_gainceiling(16)&lt;br /&gt;
# HQVGA and GRAYSCALE are the best for face tracking.&lt;br /&gt;
sensor.set_framesize(sensor.HQQVGA)&lt;br /&gt;
sensor.set_pixformat(sensor.GRAYSCALE)&lt;br /&gt;
sensor.set_brightness(-3)&lt;br /&gt;
# Load Haar Cascade&lt;br /&gt;
# By default this will use all stages, lower satges is faster but less accurate.&lt;br /&gt;
face_cascade = image.HaarCascade(&amp;quot;frontalface&amp;quot;, stages=25)&lt;br /&gt;
print(face_cascade)&lt;br /&gt;
# FPS clock&lt;br /&gt;
clock = time.clock()&lt;br /&gt;
uart = UART(4, 115200)&lt;br /&gt;
while (True):&lt;br /&gt;
    clock.tick()&lt;br /&gt;
    # Capture snapshot&lt;br /&gt;
    img = sensor.snapshot()&lt;br /&gt;
    # Find objects.&lt;br /&gt;
    # Note: Lower scale factor scales-down the image more and detects smaller objects.&lt;br /&gt;
    # Higher threshold results in a higher detection rate, with more false positives.&lt;br /&gt;
    objects = img.find_features(face_cascade, threshold=0.75, scale_factor=1.25)&lt;br /&gt;
    # Draw objects&lt;br /&gt;
    for r in objects:&lt;br /&gt;
        red_led.on()&lt;br /&gt;
        img.draw_rectangle(r)&lt;br /&gt;
        pan_center = int(r[0]+r[2]/2)&lt;br /&gt;
        tilt_center = int(r[1]+r[3]/2)&lt;br /&gt;
        img.draw_cross(pan_center, tilt_center)&lt;br /&gt;
        pan_error = pan_center-img.width()/2&lt;br /&gt;
        tilt_error = tilt_center-img.height()/2&lt;br /&gt;
        pan_output=pan_pid.get_pid(pan_error,1)/3&lt;br /&gt;
        tilt_output=tilt_pid.get_pid(tilt_error,1)&lt;br /&gt;
        pan_servo_pos=int(pan_servo_pos-pan_output)&lt;br /&gt;
        tilt_servo_pos=int(tilt_servo_pos+tilt_output)&lt;br /&gt;
        if pan_servo_pos&amp;gt;=170:&lt;br /&gt;
           pan_servo_pos=170&lt;br /&gt;
        if pan_servo_pos&amp;lt;=10:&lt;br /&gt;
           pan_servo_pos=10&lt;br /&gt;
        if tilt_servo_pos&amp;gt;=160:&lt;br /&gt;
           tilt_servo_pos=160&lt;br /&gt;
        if tilt_servo_pos&amp;lt;=30:&lt;br /&gt;
           tilt_servo_pos=30&lt;br /&gt;
        output_str=&amp;quot;[%d,%d,%d]&amp;quot; % (pan_servo_pos,tilt_servo_pos,r[2])&lt;br /&gt;
        print('you send:',output_str)&lt;br /&gt;
        uart.write(output_str+'\n')&lt;br /&gt;
        red_led.off()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
IDE运行效果为&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:microMVFaceDetector1.png||600px|left]]&amp;lt;br style=&amp;quot;clear: left&amp;quot;/&amp;gt;&lt;br /&gt;
屏幕中有人脸就会用方框注明&lt;br /&gt;
&lt;br /&gt;
=='''Microduino的代码准备'''==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;py&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
#define servoPin1  A2&lt;br /&gt;
#define servoPin2  A3&lt;br /&gt;
Servo myservo1;&lt;br /&gt;
Servo myservo2;&lt;br /&gt;
String msg = &amp;quot;&amp;quot;;&lt;br /&gt;
int16_t data0, data1, data2, data3;&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A0, INPUT);&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  myservo1.attach(servoPin1);&lt;br /&gt;
  myservo2.attach(servoPin2);&lt;br /&gt;
  myservo1.write(90);&lt;br /&gt;
  myservo2.write(90);&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (Serial.available() &amp;gt; 0) {&lt;br /&gt;
    msg = Serial.readStringUntil('\n');&lt;br /&gt;
    sscanf(msg.c_str(), &amp;quot;[%d,%d,%d]&amp;quot;, &amp;amp;data0, &amp;amp;data1, &amp;amp;data2);&lt;br /&gt;
    Serial.print(data0);&lt;br /&gt;
    Serial.print(&amp;quot; ,&amp;quot;);&lt;br /&gt;
    Serial.print(data1);&lt;br /&gt;
    Serial.print(&amp;quot; ,&amp;quot;);&lt;br /&gt;
    Serial.println(data2);&lt;br /&gt;
    myservo1.write(data0);&lt;br /&gt;
    myservo2.write(data1);&lt;br /&gt;
    delay(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Radiumray9@gmail.com</name></author>	</entry>

	</feed>