<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="th">
	<id>http://158.108.32.49/wiki/index.php?action=history&amp;feed=atom&amp;title=%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B9%88%E0%B8%AD%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%9A%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%94%E0%B9%84%E0%B8%A1%E0%B9%82%E0%B8%84%E0%B8%A3%E0%B8%84%E0%B8%AD%E0%B8%99%E0%B9%82%E0%B8%97%E0%B8%A3%E0%B8%A5%E0%B9%80%E0%B8%A5%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%9E%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%97_USB_%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2_Arduino</id>
	<title>การติดต่อกับบอร์ดไมโครคอนโทรลเลอร์ผ่านพอร์ท USB ด้วย Arduino - ประวัติรุ่นแก้ไข</title>
	<link rel="self" type="application/atom+xml" href="http://158.108.32.49/wiki/index.php?action=history&amp;feed=atom&amp;title=%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B9%88%E0%B8%AD%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%9A%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%94%E0%B9%84%E0%B8%A1%E0%B9%82%E0%B8%84%E0%B8%A3%E0%B8%84%E0%B8%AD%E0%B8%99%E0%B9%82%E0%B8%97%E0%B8%A3%E0%B8%A5%E0%B9%80%E0%B8%A5%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%9E%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%97_USB_%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2_Arduino"/>
	<link rel="alternate" type="text/html" href="http://158.108.32.49/wiki/index.php?title=%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B9%88%E0%B8%AD%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%9A%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%94%E0%B9%84%E0%B8%A1%E0%B9%82%E0%B8%84%E0%B8%A3%E0%B8%84%E0%B8%AD%E0%B8%99%E0%B9%82%E0%B8%97%E0%B8%A3%E0%B8%A5%E0%B9%80%E0%B8%A5%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%9E%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%97_USB_%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2_Arduino&amp;action=history"/>
	<updated>2026-04-15T06:14:47Z</updated>
	<subtitle>ประวัติรุ่นแก้ไขของหน้านี้ในวิกิ</subtitle>
	<generator>MediaWiki 1.33.1</generator>
	<entry>
		<id>http://158.108.32.49/wiki/index.php?title=%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B9%88%E0%B8%AD%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%9A%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%94%E0%B9%84%E0%B8%A1%E0%B9%82%E0%B8%84%E0%B8%A3%E0%B8%84%E0%B8%AD%E0%B8%99%E0%B9%82%E0%B8%97%E0%B8%A3%E0%B8%A5%E0%B9%80%E0%B8%A5%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%9E%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%97_USB_%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2_Arduino&amp;diff=56142&amp;oldid=prev</id>
		<title>Chaiporn: /* เฟิร์มแวร์ฝั่งดีไวซ์ */</title>
		<link rel="alternate" type="text/html" href="http://158.108.32.49/wiki/index.php?title=%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B9%88%E0%B8%AD%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%9A%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%94%E0%B9%84%E0%B8%A1%E0%B9%82%E0%B8%84%E0%B8%A3%E0%B8%84%E0%B8%AD%E0%B8%99%E0%B9%82%E0%B8%97%E0%B8%A3%E0%B8%A5%E0%B9%80%E0%B8%A5%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%9E%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%97_USB_%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2_Arduino&amp;diff=56142&amp;oldid=prev"/>
		<updated>2015-10-10T15:38:24Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;เฟิร์มแวร์ฝั่งดีไวซ์&lt;/span&gt;&lt;/span&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 class=&quot;diff-title&quot; lang=&quot;th&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;←รุ่นแก้ไขก่อนหน้า&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;รุ่นแก้ไขเมื่อ 15:38, 10 ตุลาคม 2558&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-l108&quot; &gt;แถว 108:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;แถว 108:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===เฟิร์มแวร์ฝั่งดีไวซ์===&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; 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=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; 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;โค้ดเฟิร์มแวร์อยู่ในสเกตช์ชื่อ &amp;lt;tt&amp;gt;usb-generic&amp;lt;/tt&amp;gt; ซึ่งคอมไพล์ได้แต่ยังทำงานไม่สมบูรณ์ &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;เฟิร์มแวร์ตัวอย่างนี้รองรับคำร้องขอ 2 &lt;/del&gt;หมายเลขคือ&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; 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;โค้ดเฟิร์มแวร์อยู่ในสเกตช์ชื่อ &amp;lt;tt&amp;gt;usb-generic&amp;lt;/tt&amp;gt; ซึ่งคอมไพล์ได้แต่ยังทำงานไม่สมบูรณ์ &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;เฟิร์มแวร์ที่สมบูรณ์ต้องรองรับคำร้องขอ 3 &lt;/ins&gt;หมายเลขคือ&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; 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;(Request ID) &lt;/del&gt;!! การให้บริการ !! &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;รวมอยู่ในตัวอย่าง&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; 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;อยู่ในตัวอย่างแล้ว&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; 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=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| 0 || ควบคุมสถานะ LED บนบอร์ดพ่วง || Yes&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| 0 || ควบคุมสถานะ LED บนบอร์ดพ่วง || Yes&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Chaiporn</name></author>
		
	</entry>
	<entry>
		<id>http://158.108.32.49/wiki/index.php?title=%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B9%88%E0%B8%AD%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%9A%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%94%E0%B9%84%E0%B8%A1%E0%B9%82%E0%B8%84%E0%B8%A3%E0%B8%84%E0%B8%AD%E0%B8%99%E0%B9%82%E0%B8%97%E0%B8%A3%E0%B8%A5%E0%B9%80%E0%B8%A5%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%9E%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%97_USB_%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2_Arduino&amp;diff=56141&amp;oldid=prev</id>
		<title>Chaiporn: /* เฟิร์มแวร์ฝั่งดีไวซ์ */</title>
		<link rel="alternate" type="text/html" href="http://158.108.32.49/wiki/index.php?title=%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B9%88%E0%B8%AD%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%9A%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%94%E0%B9%84%E0%B8%A1%E0%B9%82%E0%B8%84%E0%B8%A3%E0%B8%84%E0%B8%AD%E0%B8%99%E0%B9%82%E0%B8%97%E0%B8%A3%E0%B8%A5%E0%B9%80%E0%B8%A5%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%9E%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%97_USB_%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2_Arduino&amp;diff=56141&amp;oldid=prev"/>
		<updated>2015-10-10T15:36:51Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;เฟิร์มแวร์ฝั่งดีไวซ์&lt;/span&gt;&lt;/span&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 class=&quot;diff-title&quot; lang=&quot;th&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;←รุ่นแก้ไขก่อนหน้า&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;รุ่นแก้ไขเมื่อ 15:36, 10 ตุลาคม 2558&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-l110&quot; &gt;แถว 110:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;แถว 110:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;โค้ดเฟิร์มแวร์อยู่ในสเกตช์ชื่อ &amp;lt;tt&amp;gt;usb-generic&amp;lt;/tt&amp;gt; ซึ่งคอมไพล์ได้แต่ยังทำงานไม่สมบูรณ์ เฟิร์มแวร์ตัวอย่างนี้รองรับคำร้องขอ 2 หมายเลขคือ&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;โค้ดเฟิร์มแวร์อยู่ในสเกตช์ชื่อ &amp;lt;tt&amp;gt;usb-generic&amp;lt;/tt&amp;gt; ซึ่งคอมไพล์ได้แต่ยังทำงานไม่สมบูรณ์ เฟิร์มแวร์ตัวอย่างนี้รองรับคำร้องขอ 2 หมายเลขคือ&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; 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;! หมายเลขคำร้องขอ (Request ID) !! การให้บริการ&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; 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;! หมายเลขคำร้องขอ (Request ID) !! การให้บริการ &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;!! รวมอยู่ในตัวอย่าง&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; 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=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; 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;| 0 || ควบคุมสถานะ LED บนบอร์ดพ่วง&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; 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;| 0 || ควบคุมสถานะ LED บนบอร์ดพ่วง &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;|| Yes&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; 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=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; 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;| 1 || ตรวจสอบสถานะของสวิตช์บนบอร์ดพ่วง&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; 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;| 1 || ตรวจสอบสถานะของสวิตช์บนบอร์ดพ่วง &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;|| Yes&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; 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;|-&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; 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;| 2 || อ่านค่าตัววัดแสงบนบอร์ดพ่วง || No&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; 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=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Chaiporn</name></author>
		
	</entry>
	<entry>
		<id>http://158.108.32.49/wiki/index.php?title=%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B9%88%E0%B8%AD%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%9A%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%94%E0%B9%84%E0%B8%A1%E0%B9%82%E0%B8%84%E0%B8%A3%E0%B8%84%E0%B8%AD%E0%B8%99%E0%B9%82%E0%B8%97%E0%B8%A3%E0%B8%A5%E0%B9%80%E0%B8%A5%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%9E%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%97_USB_%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2_Arduino&amp;diff=56090&amp;oldid=prev</id>
		<title>Chaiporn: หน้าที่ถูกสร้างด้วย &#039;: &#039;&#039;วิกินี้เป็นส่วนหนึ่งของรายวิชา 01204223&#039;&#039;  ที่ผ่านม...&#039;</title>
		<link rel="alternate" type="text/html" href="http://158.108.32.49/wiki/index.php?title=%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B9%88%E0%B8%AD%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%9A%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%94%E0%B9%84%E0%B8%A1%E0%B9%82%E0%B8%84%E0%B8%A3%E0%B8%84%E0%B8%AD%E0%B8%99%E0%B9%82%E0%B8%97%E0%B8%A3%E0%B8%A5%E0%B9%80%E0%B8%A5%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%9E%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%97_USB_%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2_Arduino&amp;diff=56090&amp;oldid=prev"/>
		<updated>2015-10-10T11:15:49Z</updated>

		<summary type="html">&lt;p&gt;หน้าที่ถูกสร้างด้วย &amp;#039;: &amp;#039;&amp;#039;วิกินี้เป็นส่วนหนึ่งของรายวิชา &lt;a href=&quot;/wiki/index.php/01204223&quot; class=&quot;mw-redirect&quot; title=&quot;01204223&quot;&gt;01204223&lt;/a&gt;&amp;#039;&amp;#039;  ที่ผ่านม...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;หน้าใหม่&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: &amp;#039;&amp;#039;วิกินี้เป็นส่วนหนึ่งของรายวิชา [[01204223]]&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
ที่ผ่านมานั้นเราใช้พอร์ท USB เป็นเพียงแหล่งจ่ายพลังงานและโปรแกรมเฟิร์มแวร์เท่านั้น วิกินี้อธิบายถึงขั้นตอนและตัวอย่างการพัฒนาเฟิร์มแวร์ภายใต้สภาพแวดล้อมของ Arduino เพื่อให้บอร์ดไมโครคอนโทรลเลอร์จำลองตัวเองเป็นอุปกรณ์ USB ความเร็วต่ำ สำหรับสื่อสารกับแอพลิเคชันที่ทำงานบนเครื่องคอมพิวเตอร์ได้&lt;br /&gt;
&lt;br /&gt;
==ไลบรารีและเครื่องมือที่จำเป็น==&lt;br /&gt;
ให้แน่ใจว่าได้ติดตั้งไลบรารีและเครื่องมือที่จำเป็นตามที่ได้อธิบายไว้ในวิกิด้านล่าง ก่อนเริ่มทำตามขั้นตอนในวิกินี้&lt;br /&gt;
* [[การติดตั้งไลบรารี PyUSB]]&lt;br /&gt;
&lt;br /&gt;
==การใช้งานไลบรารี V-USB==&lt;br /&gt;
การเขียนโค้ดเพื่อเรียกใช้งานไลบรารี V-USB ภายใต้สภาพแวดล้อมของ Arduino มีขั้นตอนหลัก ๆ ดังนี้&lt;br /&gt;
* สร้างไฟล์ &amp;lt;tt&amp;gt;usbconfig.h&amp;lt;/tt&amp;gt; เพื่อบอกไลบรารี V-USB ถึงคุณลักษณะของอุปกรณ์ USB ที่เราต้องการให้บอร์ด MCU จำลองตัวเองขึ้นมา เนื่องจากการตั้งค่าต่าง ๆ ถูกระบุไว้ในรูปมาโครเป็นจำนวนมาก วิธีที่สะดวกและเสี่ยงต่อความผิดพลาดน้อยที่สุดคือคัดลอกเนื้อหามาจากไฟล์ &amp;lt;tt&amp;gt;usbconfig-prototype.h&amp;lt;/tt&amp;gt; ที่อยู่ในไดเรคตอรี &amp;lt;tt&amp;gt;usbdrv&amp;lt;/tt&amp;gt; ที่ได้จากการติดตั้ง V-USB ตามขั้นตอนก่อนหน้านี้ การตั้งค่าหลัก ๆ ที่สำคัญได้แก่&lt;br /&gt;
** &amp;lt;code&amp;gt;USB_CFG_VENDOR_ID&amp;lt;/code&amp;gt; และ &amp;lt;code&amp;gt;USB_CFG_DEVICE_ID&amp;lt;/code&amp;gt; ใช้กำหนดค่า Vendor ID (VID) และ Product ID (PID) ให้กับอุปกรณ์ USB ตัวเลขคู่นี้จะถูกตีความโดยระบบปฏิบัติการว่าเป็นอุปกรณ์ USB ประเภทใด เช่นเครื่องพิมพ์ เมาส์ คียบอร์ด ฯลฯ เพื่อที่ตัวระบบปฏิบัติการจะได้จัดหาตัวขับเคลื่อนอุปกรณ์ (device driver) มาใช้งานได้อย่างเหมาะสม ในตัวอย่างนี้มีการกำหนดค่า VID และ PID ให้เป็น 0x16c0 และ 0x05dc ตามลำดับ ซึ่งเป็นการไม่ระบุประเภทอุปกรณ์ ดูข้อมูลเพิ่มเติมจากหัวข้อ [[#เกี่ยวกับหมายเลข VID/PID]]&lt;br /&gt;
** &amp;lt;code&amp;gt;USB_CFG_VENDOR_NAME&amp;lt;/code&amp;gt; ใช้กำหนดชื่อผู้ผลิตอุปกรณ์ที่จะปรากฏให้เห็นผ่านระบบปฏิบัติการ ระบุในรูปรายการอักขระคั่นด้วยคอมม่า พร้อมทั้งระบุความยาวชื่อให้กับมาโคร &amp;lt;code&amp;gt;USB_CFG_VENDOR_NAME_LEN&amp;lt;/code&amp;gt; ในที่นี้เราจะกำหนดชื่อผู้ผลิตเป็น &amp;lt;tt&amp;gt;cpe.ku.ac.th&amp;lt;/tt&amp;gt; เพื่อให้สอดคล้องกับแนวปฏิบัติของไลบรารี V-USB&lt;br /&gt;
** &amp;lt;code&amp;gt;USB_CFG_DEVICE_NAME&amp;lt;/code&amp;gt; ใช้กำหนดชื่อของอุปกรณ์ที่จะปรากฏให้เห็นผ่านระบบปฏิบัติการ ระบุในรูปรายการอักขระคั่นด้วยคอมม่า พร้อมทั้งระบุความยาวชื่อให้กับมาโคร &amp;lt;code&amp;gt;USB_CFG_DEVICE_NAME_LEN&amp;lt;/code&amp;gt; ในที่นี้ให้กำหนดชื่อในรูป &amp;lt;tt&amp;gt;ID xxxxxxxxxx&amp;lt;/tt&amp;gt; โดยที่ &amp;lt;tt&amp;gt;xxxxxxxxxx&amp;lt;/tt&amp;gt; แทนรหัสนิสิต 10 หลักของตน&lt;br /&gt;
* สร้าง Arduino Sketch ขึ้นมาใหม่ แล้วพิมพ์คำสั่งต่อไปนี้ที่ส่วนหัวของไฟล์เพือดึงเอาไลบรารี V-USB มาใช้งาน&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;usbdrv.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* นิยามฟังก์ชัน &amp;lt;tt&amp;gt;setup()&amp;lt;/tt&amp;gt; เพื่อกำหนดหน้าที่ของขาอินพุทเอาท์พุทตามปกติ และเพิ่มโค้ดสำหรับสั่งไลบรารี V-USB ให้เตรียมการเบื้องต้นลงไปด้วยดังนี้&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // ตั้งค่าอินพุท/เอาท์พุทตามปกติ&lt;br /&gt;
  // :&lt;br /&gt;
&lt;br /&gt;
  // สั่งให้ V-USB เตรียมตัวขั้นต้น&lt;br /&gt;
  usbInit();&lt;br /&gt;
  usbDeviceDisconnect();&lt;br /&gt;
  delay(300);&lt;br /&gt;
  usbDeviceConnect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* นิยามฟังก์ชัน &amp;lt;tt&amp;gt;loop()&amp;lt;/tt&amp;gt; ให้มีการเรียกใช้ฟังก์ชัน &amp;lt;tt&amp;gt;usbPoll()&amp;lt;/tt&amp;gt; ของไลบรารี V-USB โดยให้แน่ใจว่าฟังก์ชันนี้ต้องถูกเรียกซ้ำภายในระยะเวลาไม่เกิน 50 มิลลิวินาทีอย่างต่อเนื่อง ไม่เช่นนั้นอุปกรณ์จะตอบสนองต่อคำร้องขอจากโฮสท์ไม่ทันและมีผลทำให้โฮสท์ตัดการเชื่อมต่อในที่สุด&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  // ประมวลผลตามต้องการ แต่ต้องให้แล้วเสร็จภายใน 50 มิลลิวินาที&lt;br /&gt;
  // :&lt;br /&gt;
&lt;br /&gt;
  // สั่ง V-USB ให้เฝ้าดูสัญญาณการร้องขอจากโฮสท์&lt;br /&gt;
  usbPoll();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* เมื่อพบว่ามีคำร้องขอจากโฮสท์ ไลบรารี V-USB จะเรียกหาฟังก์ชัน &amp;lt;tt&amp;gt;usbFunctionSetup()&amp;lt;/tt&amp;gt; เพื่อประมวลผลคำร้องขอนั้น เป็นหน้าที่ของเราที่ต้องสร้างฟังก์ชันนี้ขึ้นมา&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
usbMsgLen_t usbFunctionSetup(uint8_t data[8])&lt;br /&gt;
{&lt;br /&gt;
  usbRequest_t *rq = (usbRequest_t*)data;&lt;br /&gt;
&lt;br /&gt;
  // ประมวลผลข้อมูลภายในคำร้องขอผ่านทางตัวแปร rq&lt;br /&gt;
  // :&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== โครงสร้างของคำร้องขอ USB ที่รับจากฝั่งคอมพิวเตอร์ ==&lt;br /&gt;
ตามสถาปัตยกรรม USB นั้นการสื่อสารจะถูกเริ่มจากการที่ฝั่งคอมพิวเตอร์ (ฝั่งโฮสท์) ส่งคำร้องขอไปยังฝั่งอุปกรณ์เสมอไม่ว่าจะต้องการอ่านหรือเขียนข้อมูลไปยังอุปกรณ์ USB ก็ตาม ข้อมูลคำร้องขอมีขนาด 8 ไบต์ ซึ่งมีโครงสร้างดังนี้ (นิยามโครงสร้างนี้เป็นส่วนหนึ่งของไลบรารี V-USB จึงไม่ต้องเขียนขึ้นมาเอง)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct usbRequest{&lt;br /&gt;
    uchar       bmRequestType;  /* 1 ไบต์ */&lt;br /&gt;
    uchar       bRequest;       /* 1 ไบต์ */&lt;br /&gt;
    usbWord_t   wValue;         /* 2 ไบต์ */&lt;br /&gt;
    usbWord_t   wIndex;         /* 2 ไบต์ */&lt;br /&gt;
    usbWord_t   wLength;        /* 2 ไบต์ */&lt;br /&gt;
}usbRequest_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;bmRequestType&amp;lt;/code&amp;gt; ประกอบด้วยฟิลด์ย่อย 3 ฟิลด์ดังต่อไปนี้&lt;br /&gt;
:* บิต 7 ทิศทางการส่งข้อมูล (Data Phase Transfer Direction)&lt;br /&gt;
::* 0 = จากคอมพิวเตอร์ไปอุปกรณ์ USB (Host to Device)&lt;br /&gt;
::* 1 = จากอุปกรณ์ USB มายังคอมพิวเตอร์ (Device to Host)&lt;br /&gt;
:* บิต 6..5 ประเภทคำร้องขอ (Type)&lt;br /&gt;
::* 0 = Standard&lt;br /&gt;
::* 1 = Class&lt;br /&gt;
::* 2 = Vendor&lt;br /&gt;
::ฟังก์ชัน &amp;lt;code&amp;gt;usbFunctionSetup&amp;lt;/code&amp;gt; ที่เราต้องเขียนขึ้นนั้นจะถูกเรียกใช้เมื่อค่าในฟิลด์ Type นี้มีค่า 2 (Vendor) เท่านั้น&lt;br /&gt;
:* บิต 4..0 ผู้รับ (Recipient)&lt;br /&gt;
::* 0 = Device&lt;br /&gt;
::* 1 = Interface&lt;br /&gt;
::* 2 = Endpoint&lt;br /&gt;
::* 3 = Other&lt;br /&gt;
* &amp;lt;code&amp;gt;bRequest&amp;lt;/code&amp;gt; ระบุหมายเลขคำร้องขอ คำร้องขอตามมาตรฐานของ USB นั้นมีประเภทเป็น Standard ซึ่งจะถูกประมวลผลจากไลบรารี V-USB อัตโนมัติ เราจึงไม่ต้องสนใจในส่วนนี้ ส่วนที่เราต้องรับผิดชอบคือคำร้องขอแบบ Vendor ซึ่งต้องถูกออกแบบไว้ล่วงหน้าแล้วว่าอุปกรณ์ USB ของเราจะรองรับคำร้องขอหมายเลขอะไรบ้าง โดยในฟังก์ชัน &amp;lt;code&amp;gt;usbFunctionSetup&amp;lt;/code&amp;gt; ของเราต้องประมวลผลคำร้องขอเหล่านี้ได้ถูกต้อง&lt;br /&gt;
* &amp;lt;code&amp;gt;wValue&amp;lt;/code&amp;gt; และ &amp;lt;code&amp;gt;wIndex&amp;lt;/code&amp;gt; ทั้งคู่เป็นฟิลด์ที่ไม่มีความหมายใดในกรณีที่คำร้องขอเป็นแบบ Vendor ดังนั้นเราจึงมีอิสระเต็มที่ในการใช้งานฟิลด์ทั้งคู่นี้เป็นตัวส่งรายละเอียดของคำร้องขอ ซึ่งส่งได้สูงสุด 4 ไบต์&lt;br /&gt;
* &amp;lt;code&amp;gt;wLength&amp;lt;/code&amp;gt; กำหนดขนาดของข้อมูลเพิ่มเติมที่จะส่งจากฝั่งโฮสท์หรือจากอุปกรณ์ USB หากไม่มีข้อมูลเพิ่มเติม ค่านี้จะถูกเซ็ตเป็นศูนย์&lt;br /&gt;
&lt;br /&gt;
คำร้องขอนี้จะถูกส่งมายังโค้ดของเราผ่านมาทางฟังก์ชัน &amp;lt;tt&amp;gt;usbFunctionSetup()&amp;lt;/tt&amp;gt; ดังนั้นสิ่งที่เราต้องทำคือตรวจสอบข้อมูลเหล่านี้ภายในคำร้องขอ แล้วตอบสนองไปยังโฮสท์ ซึ่งเป็นไปได้สองกรณีคือ&lt;br /&gt;
# &amp;lt;b&amp;gt;ไม่มีข้อมูลส่งกลับให้โฮสท์&amp;lt;/b&amp;gt; ให้ใช้คำสั่ง &amp;lt;code&amp;gt;return 0&amp;lt;/code&amp;gt; ออกจากฟังก์ชันตามปกติ&lt;br /&gt;
# &amp;lt;b&amp;gt;มีข้อมูลส่งกลับให้โฮสท์&amp;lt;/b&amp;gt; ให้ตั้งค่าตัวแปร &amp;lt;code&amp;gt;usbMsgPtr&amp;lt;/code&amp;gt; (V-USB ประกาศไว้ให้แล้ว) ให้ชี้ไปยังตำแหน่งหน่วยความจำที่เก็บข้อมูลที่ต้องการส่งคืนโฮสท์ จากนั้นใช้คำสั่ง &amp;lt;code&amp;gt;return &amp;lt;i&amp;gt;len&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt; โดยที่ &amp;lt;i&amp;gt;len&amp;lt;/i&amp;gt; คือจำนวนไบต์ของข้อมูลที่ต้องการส่งกลับ ซึ่งส่งคืนได้ทีละไม่เกิน 8 ไบต์ ระวังว่าข้อมูลนี้ต้องยังอยู่ในหน่วยความจำแม้จะออกจากฟังก์ชัน &amp;lt;tt&amp;gt;usbFunctionSetup&amp;lt;/tt&amp;gt; ไปแล้ว ตัวแปรที่ใช้เก็บข้อมูลส่งกลับจึงต้องถูกประกาศเป็นแบบโกลบอลหรือแบบสแตติก&lt;br /&gt;
&lt;br /&gt;
ส่วนของโค้ดด้านล่างส่งค่า 12 และ 34 (ฐานสิบ) กลับไปยังโฮสท์เมื่อได้รับคำร้องขอหมายเลข 38 (ฐานสิบ) และไม่ส่งข้อมูลใด ๆ กลับไปหากคำร้องขอเป็นหมายเลขอื่น&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
usbMsgLen_t usbFunctionSetup(uint8_t data[8])&lt;br /&gt;
{&lt;br /&gt;
  usbRequest_t *rq = (usbRequest_t*)data;&lt;br /&gt;
  static uint8_t value[2];&lt;br /&gt;
&lt;br /&gt;
  if (rq-&amp;gt;bRequest == 38)&lt;br /&gt;
  {&lt;br /&gt;
    value[0] = 12;&lt;br /&gt;
    value[1] = 34;&lt;br /&gt;
    usbMsgPtr = &amp;amp;value;&lt;br /&gt;
    return sizeof(value);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; // ไม่ส่งข้อมูลกลับโฮสท์หากเป็นคำร้องขออื่น ๆ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ตัวอย่างโปรแกรม==&lt;br /&gt;
ดาวน์โหลดตัวอย่างโปรแกรม http://www.cpe.ku.ac.th/~cpj/204223/usb-generic-arduino.zip มาแตกเอาไว้ในไดเรคตอรีที่เก็บสเกตช์ Arduino ของตน (ไดเรคตอรี &amp;lt;tt&amp;gt;~/Arduino&amp;lt;/tt&amp;gt; บนลินุกซ์ หรือ &amp;lt;tt&amp;gt;~/Documents/Arduino&amp;lt;/tt&amp;gt; บน OS X)&lt;br /&gt;
&lt;br /&gt;
===เฟิร์มแวร์ฝั่งดีไวซ์===&lt;br /&gt;
โค้ดเฟิร์มแวร์อยู่ในสเกตช์ชื่อ &amp;lt;tt&amp;gt;usb-generic&amp;lt;/tt&amp;gt; ซึ่งคอมไพล์ได้แต่ยังทำงานไม่สมบูรณ์ เฟิร์มแวร์ตัวอย่างนี้รองรับคำร้องขอ 2 หมายเลขคือ&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! หมายเลขคำร้องขอ (Request ID) !! การให้บริการ&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ควบคุมสถานะ LED บนบอร์ดพ่วง&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ตรวจสอบสถานะของสวิตช์บนบอร์ดพ่วง&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ให้ปฏิบัติตามขั้นตอนดังนี้ในการอัพโหลดเฟิร์มแวร์ลงบอร์ด&lt;br /&gt;
* แก้ไขไฟล์ &amp;lt;tt&amp;gt;usbconfig.h&amp;lt;/tt&amp;gt; ในส่วนที่นิยามมาโคร &amp;lt;tt&amp;gt;USB_CFG_DEVICE_NAME&amp;lt;/tt&amp;gt; เอาไว้เพื่อตั้งชื่ออุปกรณ์ให้เป็น &amp;lt;tt style=&amp;quot;color:green;&amp;quot;&amp;gt;ID &amp;lt;i&amp;gt;รหัสนิสิต&amp;lt;/i&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define USB_CFG_DEVICE_NAME     &amp;#039;I&amp;#039;,&amp;#039;D&amp;#039;,&amp;#039; &amp;#039;,&amp;#039;9&amp;#039;,&amp;#039;9&amp;#039;,&amp;#039;9&amp;#039;,&amp;#039;9&amp;#039;,&amp;#039;9&amp;#039;,&amp;#039;9&amp;#039;,&amp;#039;9&amp;#039;,&amp;#039;9&amp;#039;,&amp;#039;9&amp;#039;,&amp;#039;9&amp;#039;  &amp;lt;-- แก้เป็นรหัสนิสิตของตน&lt;br /&gt;
#define USB_CFG_DEVICE_NAME_LEN 13&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* คอมไพล์และอัพโหลดเฟิร์มแวร์&lt;br /&gt;
* เมื่อเฟิร์มแวร์เริ่มต้นทำงาน ระบบปฏิบัติการจะมองเห็นบอร์ดไมโครคอนโทรลเลอร์เป็นอุปกรณ์ USB ทันที จะเห็นได้จากเอาท์พุทของคำสั่ง &amp;lt;tt&amp;gt;lsusb&amp;lt;/tt&amp;gt; บน Ubuntu ที่ปรากฏรายการของอุปกรณ์ที่มี VID/PID เป็น 16c0:05dc &amp;lt;u&amp;gt;แม้จะไม่ได้อยู่ในโหมดบูทโหลดเดอร์&amp;lt;/u&amp;gt; (สำหรับ Mac OS X ให้ใช้คำสั่ง &amp;lt;tt&amp;gt;system_profiler&amp;lt;/tt&amp;gt; แทน)&lt;br /&gt;
&lt;br /&gt;
===แอพลิเคชันฝั่งโฮสท์===&lt;br /&gt;
ขณะที่เฟิร์มแวร์ทำงานอยู่นั้นเราจะมองไม่เห็นผลลัพธ์การทำงานใด ๆ เนื่องจากเฟิร์มแวร์ถูกเขียนไว้ให้ตอบสนองต่อการสั่งงานผ่านคอมพิวเตอร์เท่านั้น ภายในไฟล์ตัวอย่างมีไฟล์ชื่อ &amp;lt;tt&amp;gt;practicum.py&amp;lt;/tt&amp;gt; ซึ่งเป็นโมดูลไพทอนที่เราจะนำมาใช้ติดต่อกับบอร์ดไมโครคอนโทรลเลอร์ผ่านภาษาไพทอน ทดลองเปิดไพทอนเชลล์แล้วโหลดโมดูลมาใช้งาน โดยฟังก์ชันหลักที่เรียกใช้จากโมดูลคือ &amp;lt;tt&amp;gt;findDevices()&amp;lt;/tt&amp;gt; ซึ่งคืนค่าเป็นลิสต์ของอุปกรณ์ USB ทุกตัวที่มี VID/PID เป็น 16c0:05dc ที่ต่ออยู่กับคอมพิวเตอร์ ณ ขณะนั้น&lt;br /&gt;
&lt;br /&gt;
 $ python&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; from practicum import findDevices,McuBoard&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; devices = findDevices()&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; devices&lt;br /&gt;
 [&amp;lt;usb.Device object at 0xd91d70&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
จากนั้นสร้างอ็อบเจกต์ของคลาส &amp;lt;tt&amp;gt;McuBoard&amp;lt;/tt&amp;gt; ขึ้นมาจากอุปกรณ์ตัวแรกในลิสต์&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; b = McuBoard(devices[0])&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; b.getVendorName()&lt;br /&gt;
 &amp;#039;cpe.ku.ac.th&amp;#039;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; b.getDeviceName()&lt;br /&gt;
 &amp;#039;ID 1234567890&amp;#039;  &amp;lt;- ต้องขึ้นเป็นรหัสนิสิตของตน&lt;br /&gt;
&lt;br /&gt;
ทดลองส่งคำร้องขอหมายเลข 0 (ควบคุมสถานะ LED) เพื่อให้ LED หมายเลข 2 บนบอร์ดพ่วงติดสว่าง ใช้เมท็อต &amp;lt;code&amp;gt;usbWrite&amp;lt;/code&amp;gt; ในคลาส &amp;lt;code&amp;gt;McuBoard&amp;lt;/code&amp;gt; ดังนี้&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; b.usbWrite(0, index=2, value=1)&lt;br /&gt;
&lt;br /&gt;
คำสั่งด้านล่างมีผลทำให้ LED หมายเลข 2 ดับ และ LED หมายเลข 1 ติดขึ้นมาแทน&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; b.usbWrite(0, index=2, value=0)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; b.usbWrite(0, index=1, value=1)&lt;br /&gt;
&lt;br /&gt;
ทดลองอ่านสถานะของสวิตช์โดยส่งคำร้องหมายเลข 1 ไปยังบอร์ด MCU&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; b.usbRead(1, length=1)&lt;br /&gt;
 (0,)&lt;br /&gt;
ค่าที่เมทอด &amp;lt;code&amp;gt;usbRead&amp;lt;/code&amp;gt; คืนกลับมาจะเป็นทูเปิลที่มีสมาชิกหนึ่งตัว ตามที่ระบุในเฟิร์มแวร์&lt;br /&gt;
&lt;br /&gt;
ทดลองกดสวิตช์บนบอร์ดพ่วงค้างไว้ แล้วส่งคำร้องไปยังบอร์ด MCU ใหม่ ผลลัพธ์ที่ได้ควรเป็นดังนี้&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; b.usbRead(1, length=1)&lt;br /&gt;
 (1,)&lt;br /&gt;
&lt;br /&gt;
ใช้คำสั่ง &amp;lt;tt&amp;gt;help&amp;lt;/tt&amp;gt; เพื่อดูรายละเอียดการใช้งานคลาส &amp;lt;tt&amp;gt;McuBoard&amp;lt;/tt&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; help(McuBoard)&lt;br /&gt;
&lt;br /&gt;
== เกี่ยวกับหมายเลข VID/PID ==&lt;br /&gt;
ชุดตัวเลข VID/PID ที่กำหนดให้กับอุปกรณ์ USB ไม่ควรตั้งเอาเองตามใจชอบเนื่องจากระบบปฏิบัติการจะอาศัยตัวเลขคู่นี้ในการเลือกซอฟต์แวร์ไดรเวอร์ที่จะมาควบคุมอุปกรณ์ โดยทั่วไปการจะได้มาซึ่งเลข VID/PID เพื่อใช้กับอุปกรณ์ที่เราสร้างขึ้นจำเป็นต้องสมัครเป็นสมาชิกของ [http://www.usb.org USB Implementers Forum] (ค่าสมาชิกปีละ 4,000 เหรียญสหรัฐ) หรือซื้อตัวเลข VID มาจากผู้ที่เป็นสมาชิกอีกทีหนึ่ง&lt;br /&gt;
&lt;br /&gt;
อย่างไรก็ตาม Object Development ผู้พัฒนาไลบรารี V-USB ได้เตรียมชุดตัวเลข VID/PID ไว้ให้เราใช้งานโดยไม่เสียค่าใช้จ่าย หมายเลข &amp;lt;tt&amp;gt;16C0:xxxx&amp;lt;/tt&amp;gt; ที่เราเลือกนำมาใช้งานก็ได้มาจากตัวเลขในชุดดังกล่าว รายละเอียดเพิ่มเติมเกี่ยวกับการกำหนดค่า VID และ PID ให้กับอุปกรณ์ USB รวมถึงหลักเกณฑ์การปฏิบัติในการผลิตอุปกรณ์ USB สู่สาธารณะ สามารถศึกษาเพิ่มเติมได้จากเนื้อหาในไฟล์ &amp;lt;tt&amp;gt;USB-ID-FAQ.txt&amp;lt;/tt&amp;gt; และไฟล์ &amp;lt;tt&amp;gt;USB-IDs-for-free.txt&amp;lt;/tt&amp;gt; ในไดเรคตอรี &amp;lt;tt&amp;gt;usbdrv&amp;lt;/tt&amp;gt; ที่ได้จากการติดตั้งไลบรารี V-USB รวมถึงเอกสาร [http://www.voti.nl/docs/usb-pid.html How to obtain an USB VID/PID for your project]&lt;br /&gt;
&lt;br /&gt;
== ข้อมูลเพิ่มเติม ==&lt;br /&gt;
* [http://vusb.wikidot.com/ V-USB Documentation Wiki]&lt;br /&gt;
* [http://www.beyondlogic.org/usbnutshell/usb1.htm USB in a NutShell]&lt;br /&gt;
* [http://usb4java.org/ usb4java] - ไลบรารีภาษาจาวาสำหรับติดต่อกับอุปกรณ์ USB&lt;/div&gt;</summary>
		<author><name>Chaiporn</name></author>
		
	</entry>
</feed>