{"id":39,"date":"2024-11-28T09:46:41","date_gmt":"2024-11-28T06:46:41","guid":{"rendered":"https:\/\/ta9ea.com\/?p=39"},"modified":"2024-11-28T09:46:41","modified_gmt":"2024-11-28T06:46:41","slug":"adf4351","status":"publish","type":"post","link":"https:\/\/ta9ea.com\/?p=39","title":{"rendered":"ADF4351"},"content":{"rendered":"<p><span>Bu proje F1CJN&#8217;nin<\/span><span>\u00a0Arduino projesine dayanmaktad\u0131r\u00a0. D\u00fc\u015f\u00fck maliyetli 35-4400 Mhz bir sinyal kayna\u011f\u0131 yapmak isteyenler i\u00e7in gayet ba\u015far\u0131l\u0131 sonu\u00e7lar veriyor.\u00a0 \u00a0ADF4351 mod\u00fcl\u00fcn\u00fc kullan\u0131r. ADF4351, 5 dBm&#8217;lik maksimum \u00e7\u0131k\u0131\u015f seviyesinde 10 KHz ad\u0131mlarla \u00e7al\u0131\u015fabilir. ADF4351, bu durumda Arduino ile aray\u00fcz olu\u015fturan bir SPI aray\u00fcz\u00fcne sahiptir.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-40 size-full aligncenter\" src=\"https:\/\/ta9ea.com\/wp-content\/uploads\/2024\/11\/calibrator-544x313-1.png\" alt=\"\" width=\"544\" height=\"274\" \/><\/p>\n<p><span>F1CJN&#8217;nin tasar\u0131m\u0131, frekans\u0131 g\u00f6r\u00fcnt\u00fclemek i\u00e7in bir LCD D\u00fc\u011fme Kalkan\u0131 kullan\u0131r ve d\u00fc\u011fmeler gerekli frekans\u0131 ve modu ayarlamak i\u00e7in kullan\u0131l\u0131r. Frekans\u0131n USB arac\u0131l\u0131\u011f\u0131yla ana bilgisayara ba\u011flanan seri port \u00fczerinden ayarlanmas\u0131na izin vermek i\u00e7in kodu de\u011fi\u015ftirdim. Ek olarak USB, Arduino ve ADF4351 kart\u0131na g\u00fc\u00e7 sa\u011flar. Ayr\u0131 bir 5V g\u00fc\u00e7 kayna\u011f\u0131 spektral safl\u0131\u011f\u0131 art\u0131rabilir, ancak bunun bir sorun oldu\u011funu g\u00f6rmedim. RSPduoEME uygulamas\u0131, gerekli kalibrasyon frekans\u0131n\u0131 Arduino seri portuna g\u00f6ndererek ADF4351&#8217;i kontrol eder. Kalibrasyon, frekans\u0131 bant d\u0131\u015f\u0131na 4000MHz olarak ayarlayarak etkili bir \u015fekilde kapat\u0131l\u0131r. A\u015fa\u011f\u0131daki \u015fema, ara ba\u011flant\u0131lar\u0131 g\u00f6sterir, 560\/1K diren\u00e7ler, Arduino 5V&#8217;u ADF4351 i\u00e7in 3,3V mant\u0131k seviyelerine d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kullan\u0131l\u0131r. Arduino projesinin t\u00fcm yap\u0131sal ayr\u0131nt\u0131lar\u0131 F1CJN\u00a0<\/span><span>w<\/span><span>e<\/span><span>b<\/span><span>\u00a0\u00a0makalesinde verilmi\u015ftir.<\/span><\/p>\n<p><span>De\u011fi\u015ftirilen kod, harici referans\u0131n 24MHz olarak ayarlanmas\u0131na izin verir, RSPduo harici referans\u0131 da 24MHz oldu\u011fundan kullan\u0131\u015fl\u0131d\u0131r. Harici referans kullan\u0131l\u0131rsa, XTAL osilat\u00f6r\u00fcne ba\u011flanan direncin ADF4351 mod\u00fcl\u00fcnde \u00e7\u0131kar\u0131lmas\u0131 gerekir. Kalibrat\u00f6r referans giri\u015f modu,\u00a0<\/span><span>F1CJN<\/span><span>\u00a0\u00a0makalesinde a\u00e7\u0131kland\u0131\u011f\u0131 gibi kalkan \u00fczerindeki basmal\u0131 d\u00fc\u011fmeler kullan\u0131larak ayarlan\u0131r. LCD referans g\u00f6stergesinin d\u00fczg\u00fcn \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 ve referans uygulanmad\u0131\u011f\u0131nda bile kilit durumunu g\u00f6sterdi\u011fini unutmay\u0131n. Yaz\u0131l\u0131m Mux \u00e7\u0131k\u0131\u015f\u0131n\u0131n durumunu do\u011fru \u015fekilde g\u00f6sterdi\u011finden, bu bir ADF4351 donan\u0131m sorunu gibi g\u00f6r\u00fcn\u00fcyor. De\u011fi\u015ftirilen Arduino Sketch, RSPduoEME indirme zip dosyas\u0131ndan edinilebilir.\u00a0<\/span><\/p>\n<pre class=\"lang:arduino decode:true \">#include &lt;LiquidCrystal.h&gt;\n#include &lt;EEPROM.h&gt;\n#include &lt;SPI.h&gt;\n\n#define ADF4351_LE 3\n\nLiquidCrystal lcd(8, 9, 4, 5, 6, 7);\n\nbyte poscursor = 0; \/\/position curseur courante 0 \u00e0 15\nbyte line = 0; \/\/ ligne afficheur LCD en cours 0 ou 1\nbyte memoire,RWtemp; \/\/ numero de la memoire EEPROM\n\nuint32_t registers[6] =  {0x4580A8, 0x80080C9, 0x4E42, 0x4B3, 0xBC803C, 0x580005} ; \/\/ 437 MHz avec ref \u00e0 25 MHz\n\/\/uint32_t registers[6] =  {0, 0, 0, 0, 0xBC803C, 0x580005} ; \/\/ 437 MHz avec ref \u00e0 25 MHz\nint address,modif=0,WEE=0;\nint lcd_key = 0;\nint adc_key_in  = 0;\nint timer = 0,timer2=0; \/\/ utilis\u00e9 pour mesurer la dur\u00e9e d'appui sur une touche\nunsigned int i = 0;\n\n\ndouble RFout, REFin, INT, PFDRFout, OutputChannelSpacing, FRACF;\ndouble RFoutMin = 35, RFoutMax = 4400, REFinMax = 250, PDFMax = 32;\nunsigned int long RFint,RFintold,INTA,RFcalc,PDRFout, MOD, FRAC;\nbyte OutputDivider;byte lock=2;\nunsigned int long reg0, reg1;\n\n#define btnRIGHT  0\n#define btnUP     1\n#define btnDOWN   2\n#define btnLEFT   3\n#define btnSELECT 4\n#define btnNONE   5\n\n\/\/**************************** SP LECTURE BOUTONS ********************************************\nint read_LCD_buttons()\n{\n  adc_key_in = analogRead(0);      \/\/ read the value from the buttons\n  if (adc_key_in &lt; 790)lcd.blink();\n  \n  if (adc_key_in &lt; 50)return btnRIGHT;  \/\/ pour Afficheur ROBOT V1.0\n  if (adc_key_in &lt; 195)return btnUP;\n  if (adc_key_in &lt; 380)return btnDOWN;\n  if (adc_key_in &lt; 555)return btnLEFT;\n  if (adc_key_in &lt; 790)return btnSELECT; \/\/ Fin Afficheur ROBOT1.1\n\n  \/\/if (adc_key_in &lt; 50)return btnRIGHT; \/\/ pour Afficheur ROBOT 1.1\n  \/\/if (adc_key_in &lt; 250)return btnUP;\n  \/\/if (adc_key_in &lt; 450)return btnDOWN;\n  \/\/if (adc_key_in &lt; 650)return btnLEFT;\n  \/\/if (adc_key_in &lt; 850)return btnSELECT; \/\/ fin Afficheur ROBOT 1.1\n\n  return btnNONE;  \/\/ touches non appuyees\n}\n\n\/\/***************************** SP Affichage Fr\u00e9quence sur LCD ********************************\nvoid printAll ()\n{\n  \/\/RFout=1001.10 \/\/ test\n  lcd.setCursor(0, 0);\n  lcd.print(\"RF = \");\n  if (RFint &lt; 100000) lcd.print(\" \");\n  if (RFint &lt; 10000)  lcd.print(\" \");\n  lcd.print(RFint\/100);lcd.print(\".\");\n  RFcalc=RFint-((RFint\/100)*100);\n  if (RFcalc&lt;10)lcd.print(\"0\");\n  lcd.print(RFcalc);\n  lcd.print(\" MHz\");\n  lcd.setCursor(0,1);\n  if (WEE==0) {lcd.print(\"REE=\");}\n  else {lcd.print(\"WEE=\");}\n  if (memoire&lt;10)lcd.print(\" \");\n  lcd.print(memoire,DEC);\n  if  ((digitalRead(2)==1))lcd.print(\" LOCKED \");\n  else lcd.print(\" NOLOCK \");\n  lcd.print(PFDRFout,DEC);\n  lcd.setCursor(poscursor,line);\n}\n\nvoid WriteRegister32(const uint32_t value)   \/\/Programme un registre 32bits\n{\n  digitalWrite(ADF4351_LE, LOW);\n  for (int i = 3; i &gt;= 0; i--)          \/\/ boucle sur 4 x 8bits\n  SPI.transfer((value &gt;&gt; 8 * i) &amp; 0xFF); \/\/ d\u00e9calage, masquage de l'octet et envoi via SPI\n  digitalWrite(ADF4351_LE, HIGH);\n  digitalWrite(ADF4351_LE, LOW);\n}\n\nvoid SetADF4351()  \/\/ Programme tous les registres de l'ADF4351\n{ for (int i = 5; i &gt;= 0; i--)  \/\/ programmation ADF4351 en commencant par R5\n    WriteRegister32(registers[i]);\n}\n\n\/\/ *************** SP ecriture Mot long (32bits) en EEPROM  entre adress et adress+3 **************\nvoid EEPROMWritelong(int address, long value)\n      {\n      \/\/Decomposition du long (32bits) en 4 bytes\n      \/\/trois = MSB -&gt; quatre = lsb\n      byte quatre = (value &amp; 0xFF);\n      byte trois = ((value &gt;&gt; 8) &amp; 0xFF);\n      byte deux = ((value &gt;&gt; 16) &amp; 0xFF);\n      byte un = ((value &gt;&gt; 24) &amp; 0xFF);\n\n      \/\/Ecrit 4 bytes dans la memoire EEPROM\n      EEPROM.write(address, quatre);\n      EEPROM.write(address + 1, trois);\n      EEPROM.write(address + 2, deux);\n      EEPROM.write(address + 3, un);\n      }\n\n\/\/ *************** SP lecture Mot long (32bits) en EEPROM situe entre adress et adress+3 **************\nlong EEPROMReadlong(long address)\n      {\n      \/\/Read the 4 bytes from the eeprom memory.\n      long quatre = EEPROM.read(address);\n      long trois = EEPROM.read(address + 1);\n      long deux = EEPROM.read(address + 2);\n      long un = EEPROM.read(address + 3);\n\n      \/\/Retourne le long(32bits) en utilisant le shift de 0, 8, 16 et 24 bits et des masques\n      return ((quatre &lt;&lt; 0) &amp; 0xFF) + ((trois &lt;&lt; 8) &amp; 0xFFFF) + ((deux &lt;&lt; 16) &amp; 0xFFFFFF) + ((un &lt;&lt; 24) &amp; 0xFFFFFFFF);\n      }\n\/\/************************************ Setup ****************************************\nvoid setup() {\n  lcd.begin(16, 2); \/\/ two 16 characters lines\n  lcd.display();\n  analogWrite(10,255); \/\/Luminosite LCD\n\n  Serial.begin (19200); \/\/  Serial to the PC via Arduino \"Serial Monitor\"  at 9600\n  lcd.print(\"   GENERATEUR   \");\n  lcd.setCursor(0, 1);\n  lcd.print(\"    ADF4351     \");\n  poscursor = 7; line = 0; \n  delay(1000);\n  lcd.setCursor(0, 0);\n  lcd.print(\"   par F1CJN    \");\n   delay(1000);\n\n  pinMode(2, INPUT);  \/\/ PIN 2 en entree pour lock\n  pinMode(ADF4351_LE, OUTPUT);          \/\/ Setup pins\n  digitalWrite(ADF4351_LE, HIGH);\n  SPI.begin();                          \/\/ Init SPI bus\n  SPI.setDataMode(SPI_MODE0);           \/\/ CPHA = 0 et Clock positive\n  SPI.setBitOrder(MSBFIRST);            \/\/ poids forts en t\u00eate\n\n  if (EEPROM.read(100)==55){PFDRFout=EEPROM.read(20*4);} \/\/ si la ref est ecrite en EEPROM, on la lit\n  else {PFDRFout=25;}\n\n  if (EEPROM.read(101)==55){RFint=EEPROMReadlong(memoire*4);} \/\/ si une frequence est ecrite en EEPROM on la lit\n  else {RFint=7000;}\n\n  RFintold=1234;\/\/pour que RFintold soit different de RFout lors de l'init\n  RFout = RFint\/100 ; \/\/ fr\u00e9quence de sortie\n  OutputChannelSpacing = 0.01; \/\/ Pas de fr\u00e9quence = 10kHz\n\n  WEE=0;  address=0;\n  lcd.blink();\n  printAll(); delay(500);\n\n\n} \/\/ Fin setup\n\n\/\/*************************************Loop***********************************\nvoid loop()\n{\n  RFout=RFint;\n  RFout=RFout\/100;\n  if ((RFint != RFintold)|| (modif==1)) {\n    \/\/Serial.print(RFout,DEC);Serial.print(\"\\r\\n\");\n    if (RFout &gt;= 2200) {\n      OutputDivider = 1;\n      bitWrite (registers[4], 22, 0);\n      bitWrite (registers[4], 21, 0);\n      bitWrite (registers[4], 20, 0);\n    }\n    if (RFout &lt; 2200) {\n      OutputDivider = 2;\n      bitWrite (registers[4], 22, 0);\n      bitWrite (registers[4], 21, 0);\n      bitWrite (registers[4], 20, 1);\n    }\n    if (RFout &lt; 1100) {\n      OutputDivider = 4;\n      bitWrite (registers[4], 22, 0);\n      bitWrite (registers[4], 21, 1);\n      bitWrite (registers[4], 20, 0);\n    }\n    if (RFout &lt; 550)  {\n      OutputDivider = 8;\n      bitWrite (registers[4], 22, 0);\n      bitWrite (registers[4], 21, 1);\n      bitWrite (registers[4], 20, 1);\n    }\n    if (RFout &lt; 275)  {\n      OutputDivider = 16;\n      bitWrite (registers[4], 22, 1);\n      bitWrite (registers[4], 21, 0);\n      bitWrite (registers[4], 20, 0);\n    }\n    if (RFout &lt; 137.5) {\n      OutputDivider = 32;\n      bitWrite (registers[4], 22, 1);\n      bitWrite (registers[4], 21, 0);\n      bitWrite (registers[4], 20, 1);\n    }\n    if (RFout &lt; 68.75) {\n      OutputDivider = 64;\n      bitWrite (registers[4], 22, 1);\n      bitWrite (registers[4], 21, 1);\n      bitWrite (registers[4], 20, 0);\n    }\n\n    INTA = (RFout * OutputDivider) \/ PFDRFout;\n    MOD = (PFDRFout \/ OutputChannelSpacing);\n    FRACF = (((RFout * OutputDivider) \/ PFDRFout) - INTA) * MOD;\n    FRAC = round(FRACF); \/\/ On arrondit le r\u00e9sultat\n\n    registers[0] = 0;\n    registers[0] = INTA &lt;&lt; 15; \/\/ OK\n    FRAC = FRAC &lt;&lt; 3;\n    registers[0] = registers[0] + FRAC;\n\n    registers[1] = 0;\n    registers[1] = MOD &lt;&lt; 3;\n    registers[1] = registers[1] + 1 ; \/\/ ajout de l'adresse \"001\"\n    bitSet (registers[1], 27); \/\/ Prescaler sur 8\/9\n\n    bitSet (registers[2], 28); \/\/ Digital lock == \"110\" sur b28 b27 b26\n    bitSet (registers[2], 27); \/\/ digital lock \n    bitClear (registers[2], 26); \/\/ digital lock\n   \n    SetADF4351();  \/\/ Programme tous les registres de l'ADF4351\n    RFintold=RFint;modif=0;\n    printAll();  \/\/ Affichage LCD\n  }\n\n  lcd_key = read_LCD_buttons();  \/\/ read the buttons\n\n  switch (lcd_key)               \/\/ Select action\n  {\n    case btnRIGHT: \/\/Droit\n      poscursor++; \/\/ cursor to the right\n      if (line == 0) {\n        if (poscursor == 9 ) {\n          poscursor = 10;\n          line = 0; } \/\/si curseur sur le .\n        if (poscursor == 12 ) {\n          poscursor = 0; line = 1; }; \/\/si curseur \u00e0 droite\n      }\n     if (line == 1) {\n        if (poscursor == 1 ) {poscursor = 5; line = 1; } \/\/si curseur sur le chiffre memoire \n        if (poscursor == 6 ) {poscursor = 15; line = 1; } \/\/si curseur sur le chiffre memoire \n        if (poscursor==16) {poscursor=5; line=0;};     \n      }  \n      \/\/Serial.print (\" RIGHT Button\\r\\n\");\n      lcd.setCursor(poscursor, line);\n      break;\n      \n    case btnLEFT: \/\/Gauche\n      poscursor--; \/\/ d\u00e9calage curseur\n      if (line == 0) {\n        if (poscursor == 4) {poscursor = 15; line = 1;  };\n        if (poscursor == 9) {   poscursor = 8; line=0;}\n      }\n       if(line==1){\n          if (poscursor==255) {poscursor=11; line=0;};\n          if (poscursor==4) {poscursor=0; line=1;};\n          if (poscursor==14) {poscursor=5; line=1;};\n      }\n      \/\/Serial.print(poscursor,DEC);  \n      lcd.setCursor(poscursor, line);\n      break;\n      \n    case btnUP: \/\/Haut\n      if (line == 0)\n      { \/\/ RFoutfrequency\n        \/\/Serial.print(oldRFint,DEC);\n        if (poscursor == 5) RFint = RFint + 100000 ;\n        if (poscursor == 6) RFint = RFint + 10000 ;\n        if (poscursor == 7) RFint = RFint + 1000 ;\n        if (poscursor == 8) RFint = RFint + 100 ;\n        if (poscursor == 10) RFint = RFint + 10 ;\n        if (poscursor == 11) RFint = RFint + 1 ;\n        if (RFint &gt; 440000)RFint = RFintold;\n        \/\/Serial.print(RFint,DEC);\n        \/\/Serial.print(\"  \\r\\n\");\n      }\n      if (line == 1)\n      { \n        if (poscursor == 5){ memoire++; \n        if (memoire==20)memoire=0;\n        if (WEE==0){RFint=EEPROMReadlong(memoire*4); \/\/ lecture EEPROM et Affichage\n           if (RFint&gt;440000) RFint=440000; \n           } \n        }  \n        if (poscursor==15){ \n        if( PFDRFout==10){PFDRFout=25;} \/\/reglage FREF\n        else if ( PFDRFout==25){PFDRFout=10;}\n        else PFDRFout=25;\/\/ au cas ou PFDRF different de 10 et 25\n        modif=1;  }\n                    \n      if( (poscursor==0) &amp;&amp; (WEE==1))WEE=0;\n      else if ((poscursor==0) &amp;&amp; (WEE==0))WEE=1;                  \n      }\n        printAll();\n      break; \/\/ fin bouton up\n\n    case btnDOWN: \/\/bas\n      if (line == 0) {\n        if (poscursor == 5) RFint = RFint - 100000 ;\n        if (poscursor == 6) RFint = RFint - 10000 ;\n        if (poscursor == 7) RFint = RFint - 1000 ;\n        if (poscursor == 8) RFint = RFint - 100 ;\n        if (poscursor == 10) RFint = RFint - 10 ;\n        if (poscursor == 11) RFint = RFint - 1 ;\n        if (RFint &lt; 3450) RFint = RFintold;\n        if (RFint &gt; 440000)  RFint = RFintold;\n        break;\n      }\n\n     if (line == 1)\n      { \n        if (poscursor == 5){memoire--; \n        if (memoire==255)memoire=19;\n        if (WEE==0){RFint=EEPROMReadlong(memoire*4); \/\/ lecture EEPROM et Affichage\n           if (RFint&gt;440000) RFint=440000;\n          \/\/ Serial.print(RFint,DEC);  \n           } \n        } \/\/ fin poscursor =5 \n\n       if (poscursor==15){ \n       if( PFDRFout==10){PFDRFout=25;} \/\/reglage FREF\n       else if ( PFDRFout==25){PFDRFout=10;}\n       else PFDRFout=25;\/\/ au cas ou PFDRF different de 10 et 25\n       modif=1;\n       }\n                   \n       if( (poscursor==0) &amp;&amp; (WEE==1))WEE=0;\n       else if ((poscursor==0)&amp;&amp;(WEE==0))WEE=1;                          \n      \n       printAll();\n      \/\/ Serial.print (\" DOWN Button  \\r\\n\");\n      break; \/\/ fin bouton bas\n      }\n\n    case btnSELECT:\n      do {\n        adc_key_in = analogRead(0);      \/\/ Test release button\n        delay(1); timer2++;        \/\/ timer inc toutes les 1 millisecondes\n        if (timer2 &gt; 600) { \/\/attente 600 millisecondes\n         if (WEE==1 || poscursor==15){ \n         if (line==1 &amp;&amp; poscursor==15){ EEPROMWritelong(20*4,PFDRFout);EEPROM.write(100,55);} \/\/ ecriture FREF\n         else if (WEE==1) {EEPROMWritelong(memoire*4,RFint);EEPROM.write(101,55);}\/\/ ecriture RF en EEPROM \u00e0 adresse (memoire*4)\n          lcd.setCursor(0,1); lcd.print(\"  MEMORISATION  \");}\n          lcd.setCursor(poscursor,line);\n          delay(500);timer2=0;\n          printAll();\n        }; \/\/ mes\n\n        } \n      while (adc_key_in &lt; 900); \/\/ attente relachement\n      break;  \/\/ Fin bouton Select\n\n     case btnNONE: {\n        break;\n      };\n      break;\n  }\/\/ Fin LCD keys\n\n   do { adc_key_in = analogRead(0); delay(1);} while (adc_key_in &lt; 900); \/\/ attente relachement touche\n   delay (10);timer++; \/\/ inc timer\n   \/\/Serial.print(timer,DEC);\n   if (timer&gt;1000){lcd.noBlink();timer=0;} \/\/ curseur off\n\n}   \/\/ fin loop<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bu proje F1CJN&#8217;nin\u00a0Arduino projesine dayanmaktad\u0131r\u00a0. D\u00fc\u015f\u00fck maliyetli 35-4400 Mhz bir sinyal kayna\u011f\u0131 yapmak isteyenler i\u00e7in gayet ba\u015far\u0131l\u0131 sonu\u00e7lar veriyor.\u00a0 \u00a0ADF4351 mod\u00fcl\u00fcn\u00fc kullan\u0131r. ADF4351, 5 dBm&#8217;lik [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":40,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,3],"tags":[],"class_list":["post-39","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ardu","category-hamrad"],"_links":{"self":[{"href":"https:\/\/ta9ea.com\/index.php?rest_route=\/wp\/v2\/posts\/39","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ta9ea.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ta9ea.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ta9ea.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ta9ea.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=39"}],"version-history":[{"count":0,"href":"https:\/\/ta9ea.com\/index.php?rest_route=\/wp\/v2\/posts\/39\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ta9ea.com\/index.php?rest_route=\/"}],"wp:attachment":[{"href":"https:\/\/ta9ea.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=39"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ta9ea.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=39"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ta9ea.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=39"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}