Python Instrument Panel(12)AD9851 DDSモジュール
大分前に流行った中華DDSモジュールを見付けたので、Androidアプリ「GUI Maker for ESP8266 & ESP32 – Python Inst. Panel」を使ってAndroidからコントロールできるようにしました。最後に載せてあるXMLをAndroidのブラウザでコピーしてアプリにペーストすることでインストールできます。
このモジュールはシリアル制御とパラレル制御に対応していますが、ブレッドボードに挿すときパラレル制御用のピンが邪魔なのでニッパーで切ってしまいます。
ESP-32のI2C端子にOLEDモジュールを接続して、ESP-32に割り振られたIPアドレスを表示するようにします。Python Instrument Panel(2)ArduinoスケッチをOLEDモジュール対応版に更新しました。
先ずは、ESP8266またはESP32のArduinoスケッチを変更します。
このDDSモジュールは秋月で販売されていて、メーカーサンプルスケッチ(ライブラリ込み)をダウンロードできます。ライブラリでビルドエラーが発生する場合は、EF_AD9850.hの#include <avr/pgmspace.h>の行を次のように変更します。
#if (defined(__AVR__)) #include <avr\pgmspace.h> #else #include <pgmspace.h> #endif
スケッチ全体は「Python Instrument Panel(2)Arduinoスケッチ」を見てください。最後にある mySetup()とprocess() を変更します。電源投入時1MHzに設定、その後Wi-Fiで送られてくる文字列”F:<周波数>”で指定された周波数に変更しています。
#include <EF_AD9850.h> ... // EF_AD9850(int D_CLK, int D_FQUP, int D_REST, int D_BitData) EF_AD9850 AD9850(18, 19, 23, 5); ... void mySetup() { AD9850.init(); AD9850.reset(); AD9850.wr_serial(0x01, 1000000); //1MHz } ... String process(String str) { Serial.println(str); if (str.startsWith("F:")) { int f = str.substring(2).toInt(); AD9850.wr_serial(0x01, f); } return ""; }
Androidアプリ「GUI Maker for ESP8266 & ESP32 – Python Inst. Panel」で作成した”AD9851”パネルのPanel contextは次のようになります。Androidのブラウザでコピーして、で追加した新規パネルのPanel context でペースト、さらにで新規パネルが”AD9851”パネルになります。
<?xml version="1.0" encoding="utf-8"?> <PanelContext xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Id>61a9a6cc-b854-439d-9096-5304b02cf855</Id> <PredefinedId>00000000-0000-0000-0000-000000000000</PredefinedId> <Name>AD9851</Name> <ItemList> <ItemContext> <Id>20a7fcaf-007b-4cda-89a3-4d681d91f6b5</Id> <Index>1</Index> <ItemType>3</ItemType> <X>250</X> <Y>-20</Y> <TextW>350</TextW> <TextH>100</TextH> <TextText> </TextText> <TextFontSize>64</TextFontSize> <TextTextAlignment>2</TextTextAlignment> <TextF>4294967295</TextF> <TextB>65535</TextB> <TextScript /> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>c111e9fd-f051-417d-85c9-df02d91946a3</Id> <Index>2</Index> <ItemType>0</ItemType> <X>520</X> <Y>-140</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>BS</ButtonText> <ButtonFontSize>32</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>if len(freqStr) > 0: freqStr = freqStr[:-1]</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>b9044844-0af0-4b4d-bf8e-632e517d7e2e</Id> <Index>3</Index> <ItemType>0</ItemType> <X>520</X> <Y>-230</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>MHz</ButtonText> <ButtonFontSize>32</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>setFreq(1000000)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>16c3fa26-e30e-4c3e-b421-8f8c4874822c</Id> <Index>4</Index> <ItemType>0</ItemType> <X>520</X> <Y>-320</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>kHz</ButtonText> <ButtonFontSize>32</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>setFreq(1000)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>d9320546-8725-4466-b4bd-75e459e8c1ae</Id> <Index>5</Index> <ItemType>0</ItemType> <X>520</X> <Y>-410</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>Hz</ButtonText> <ButtonFontSize>32</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>setFreq(1)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>145dd3a1-53d6-489b-8efc-b01ad212fb10</Id> <Index>6</Index> <ItemType>0</ItemType> <X>430</X> <Y>-140</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>9</ButtonText> <ButtonFontSize>48</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>freqStr += sender.Text dispFreq(freqStr)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>1711dec3-6df1-4e1e-8653-275d6254b088</Id> <Index>7</Index> <ItemType>0</ItemType> <X>340</X> <Y>-140</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>8</ButtonText> <ButtonFontSize>48</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>freqStr += sender.Text dispFreq(freqStr)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>1c580036-e1f9-4b8b-aefb-ebbd0b7d0422</Id> <Index>8</Index> <ItemType>0</ItemType> <X>250</X> <Y>-140</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>7</ButtonText> <ButtonFontSize>48</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>freqStr += sender.Text dispFreq(freqStr)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>db115e19-359f-4b8b-bff2-1d481e76a518</Id> <Index>9</Index> <ItemType>0</ItemType> <X>430</X> <Y>-230</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>6</ButtonText> <ButtonFontSize>48</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>freqStr += sender.Text dispFreq(freqStr)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>96560485-cc57-4555-813e-8fddbd190659</Id> <Index>10</Index> <ItemType>0</ItemType> <X>340</X> <Y>-230</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>5</ButtonText> <ButtonFontSize>48</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>freqStr += sender.Text dispFreq(freqStr)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>05bb0aa8-f2e8-479f-9345-2d64cb1ff069</Id> <Index>11</Index> <ItemType>0</ItemType> <X>250</X> <Y>-230</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>4</ButtonText> <ButtonFontSize>48</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>freqStr += sender.Text dispFreq(freqStr)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>c9a502b5-589d-4d0a-9470-ff5fd32042e1</Id> <Index>12</Index> <ItemType>0</ItemType> <X>430</X> <Y>-320</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>3</ButtonText> <ButtonFontSize>48</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>freqStr += sender.Text dispFreq(freqStr)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>abb813ef-b0cc-458c-9c75-3870403fb6e9</Id> <Index>13</Index> <ItemType>0</ItemType> <X>340</X> <Y>-320</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>2</ButtonText> <ButtonFontSize>48</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>freqStr += sender.Text dispFreq(freqStr)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>a4752d0d-2b88-4e6b-b003-cf763ccb20f6</Id> <Index>14</Index> <ItemType>0</ItemType> <X>250</X> <Y>-320</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>1</ButtonText> <ButtonFontSize>48</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>freqStr += sender.Text dispFreq(freqStr)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>7ee80001-58bc-4329-a1b2-12bb690a8e60</Id> <Index>15</Index> <ItemType>0</ItemType> <X>430</X> <Y>-410</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>C</ButtonText> <ButtonFontSize>32</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>freqStr = '' dispFreq(freqStr)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>84c04bc8-6232-4d91-8b6a-adfc21231309</Id> <Index>16</Index> <ItemType>0</ItemType> <X>340</X> <Y>-410</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>.</ButtonText> <ButtonFontSize>48</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>freqStr += sender.Text dispFreq(freqStr)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>56d2348e-f031-4091-b146-ce57cf8116bd</Id> <Index>17</Index> <ItemType>0</ItemType> <X>250</X> <Y>-410</Y> <ButtonW>80</ButtonW> <ButtonH>80</ButtonH> <ButtonText>0</ButtonText> <ButtonFontSize>48</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>freqStr += sender.Text dispFreq(freqStr)</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>106f9dcf-b3d8-4ec5-951f-ef733d61cb2a</Id> <Index>18</Index> <ItemType>3</ItemType> <X>10</X> <Y>-320</Y> <TextW>200</TextW> <TextH>50</TextH> <TextText>100 </TextText> <TextFontSize>32</TextFontSize> <TextTextAlignment>2</TextTextAlignment> <TextF>4294967295</TextF> <TextB>65535</TextB> <TextScript /> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>a5114cb9-c59a-43f5-beed-37080120b0c3</Id> <Index>19</Index> <ItemType>3</ItemType> <X>10</X> <Y>-210</Y> <TextW>200</TextW> <TextH>50</TextH> <TextText>20,000 </TextText> <TextFontSize>32</TextFontSize> <TextTextAlignment>2</TextTextAlignment> <TextF>4294967295</TextF> <TextB>65535</TextB> <TextScript /> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>3c162342-2701-4569-81e8-d992fe0af15c</Id> <Index>20</Index> <ItemType>0</ItemType> <X>10</X> <Y>-270</Y> <ButtonW>200</ButtonW> <ButtonH>50</ButtonH> <ButtonText>Start freq</ButtonText> <ButtonFontSize>28</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>startFreq = freq dispStartFreq()</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>1ca31ec0-1ce6-4bb3-978a-b888ffe0ffc7</Id> <Index>21</Index> <ItemType>0</ItemType> <X>10</X> <Y>-160</Y> <ButtonW>200</ButtonW> <ButtonH>50</ButtonH> <ButtonText>Stop freq</ButtonText> <ButtonFontSize>28</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>stopFreq = freq dispStopFreq()</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>b8cb3773-93ff-4804-a07b-2c4bcbe39d19</Id> <Index>22</Index> <ItemType>0</ItemType> <X>10</X> <Y>-60</Y> <ButtonW>200</ButtonW> <ButtonH>80</ButtonH> <ButtonText>Sweep</ButtonText> <ButtonFontSize>32</ButtonFontSize> <ButtonTextAlignment>1</ButtonTextAlignment> <ButtonF>255</ButtonF> <ButtonB>4076008191</ButtonB> <ButtonScript>if Items[23].Value == 0: sender.B = 0x00ff00ff freq = stopFreq longWait = 0 Items[23].Value = 1 else: sender.B = 0xF2F2F2FF Items[23].Value = 0</ButtonScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>d6883d3d-f346-44ab-a491-305fcfd15c04</Id> <Index>23</Index> <ItemType>5</ItemType> <X>0</X> <Y>0</Y> <TimerValue>false</TimerValue> <TimerInterval>0.2</TimerInterval> <TimerScript>if longWait > 0: longWait -= sender.Interval if longWait <= 0.0: step = (stopFreq - startFreq) / points if freq >= stopFreq: freq = startFreq longWait = 0.5 elif freq + step >= stopFreq: freq = stopFreq else: freq += step sendFreq()</TimerScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>5127c5a0-3893-4a01-8da7-884227b9c5ac</Id> <Index>24</Index> <ItemType>3</ItemType> <X>10</X> <Y>-380</Y> <TextW>100</TextW> <TextH>50</TextH> <TextText>Points</TextText> <TextFontSize>28</TextFontSize> <TextTextAlignment>1</TextTextAlignment> <TextF>4294967295</TextF> <TextB>0</TextB> <TextScript /> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>cb2dcb25-512f-49e9-876a-10ec78fc1478</Id> <Index>25</Index> <ItemType>3</ItemType> <X>10</X> <Y>-440</Y> <TextW>100</TextW> <TextH>50</TextH> <TextText>Wait</TextText> <TextFontSize>28</TextFontSize> <TextTextAlignment>1</TextTextAlignment> <TextF>4294967295</TextF> <TextB>0</TextB> <TextScript /> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>7e0e7494-3ceb-4ae3-9153-a48d7240f0fa</Id> <Index>26</Index> <ItemType>4</ItemType> <X>110</X> <Y>-380</Y> <DropdownW>100</DropdownW> <DropdownH>50</DropdownH> <DropdownText>10;20;30;40;50;60;70;80;90;100</DropdownText> <DropdownFontSize>24</DropdownFontSize> <DropdownValue>9</DropdownValue> <DropdownScript>points = int(sender.Options[sender.Value])</DropdownScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> <ItemContext> <Id>0b00bab7-3e5d-4c40-bfbe-64798f539e40</Id> <Index>27</Index> <ItemType>4</ItemType> <X>110</X> <Y>-440</Y> <DropdownW>100</DropdownW> <DropdownH>50</DropdownH> <DropdownText>0.1s;0.2s;0.3s;0.4s;0.5s;0.6s;0.7s;0.8s;0.9s;1s</DropdownText> <DropdownFontSize>24</DropdownFontSize> <DropdownValue>1</DropdownValue> <DropdownScript>Items[23].Interval = float( sender.Options[sender.Value][:-1])</DropdownScript> <V1_0_5 /> <V1_1_0 /> </ItemContext> </ItemList> <CurrentItemId>20a7fcaf-007b-4cda-89a3-4d681d91f6b5</CurrentItemId> <SetupScript>from System import String def sendFreq(): dispFreq('{:,}'.format(freq)) msg = 'F:%d' % freq #print msg if Remote.Writer != None: Remote.Writer.WriteLine(msg) Remote.Writer.Flush() def textToFreq(str): try: return int(str.replace(',', '')) except ValueError: return -1 def dispFreq(str): Items[1].Text = str + ' ' def dispStartFreq(): Items[18].Text = '{:,}'.format(startFreq) + ' ' def dispStopFreq(): Items[19].Text = '{:,}'.format(stopFreq) + ' ' def setFreq(mag): global freqStr, freq if freqStr == '': return freq = int(float(freqStr) * mag) freqStr = '' sendFreq() points = int(Items[26].Options[Items[26].Value]) Items[23].Interval = float(Items[27].Options[Items[27].Value][:-1]) freqStr = '' freq = textToFreq(Items[1].Text) startFreq = textToFreq(Items[18].Text) stopFreq = textToFreq(Items[19].Text) if freq >= 0: dispFreq('{:,}'.format(freq)) dispStartFreq() dispStopFreq()</SetupScript> <TeardownScript /> </PanelContext>