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) &gt; 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 &gt; 0:
    longWait -= sender.Interval
if longWait &lt;= 0.0:
    step = (stopFreq - startFreq) / points
    if freq &gt;= stopFreq:
        freq = startFreq
        longWait = 0.5
    elif freq + step &gt;= 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 &gt;= 0:
    dispFreq('{:,}'.format(freq))
dispStartFreq()
dispStopFreq()</SetupScript>
  <TeardownScript />
</PanelContext>