大分前に流行った中華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のブラウザでコピーして、
<?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>