{"id":223,"date":"2015-01-03T00:25:40","date_gmt":"2015-01-03T00:25:40","guid":{"rendered":"http:\/\/int03.co.uk\/blog\/?page_id=223"},"modified":"2020-11-16T14:58:48","modified_gmt":"2020-11-16T14:58:48","slug":"raspberry-pi-espresso-cpu-from-scratch","status":"publish","type":"page","link":"https:\/\/int03.co.uk\/blog\/raspberry-pi-espresso-cpu-from-scratch\/","title":{"rendered":"Raspberry Pi Espresso CPU&#8230; from scratch"},"content":{"rendered":"<p>Having corrupted my SD card <strong>again<\/strong> (deep sigh), it&#8217;s time for a complete rebuild <strong>again<\/strong>. I thought this would be an opportunity to update these notes.<\/p>\n<p>The first task is to download an image and write to an SD card. Previously\u00a0I downloaded Raspbian (Kernel 3.12, Release 2014-12-24) from <a title=\"Raspberry Pi Downloads\" href=\"http:\/\/www.raspberrypi.org\/downloads\" target=\"_blank\" rel=\"noopener\">raspberrypi.org<\/a>. I used <a title=\"Win32DiskImager\" href=\"http:\/\/http:\/\/sourceforge.net\/projects\/win32diskimager\" target=\"_blank\" rel=\"noopener\">Win32DiskImager<\/a> to write this to an 8GB SD card. This time I used the Noobs image and selected Raspian OS (although, having done this, I would not recommend Noobs because the two stage boot makes things rather more difficult to set up. If you are starting from scratch,\u00a0I would recommend\u00a0using\u00a0the vanilla Raspbian image as I did originally).<\/p>\n<p>I&#8217;m using a Raspberry Pi Model A, 2nd revision board. After hooking it up to a TV with HDMI, I connected a USB keyboard and wireless USB dongle to the single USB port on the Pi, and powered on.<\/p>\n<p>First time I did this, the Pi booted up with a configuration menu. I expanded the file-system to fill the SD card, over-clocked to 900Mhz, changed the root password and host-name. More recently, using Noobs, I was able to do this\u00a0same\u00a0configuration under X windows.<\/p>\n<p>The Pi was set to boot to CLI, without automatic log on, both SPI and I2C were enabled in the configuration.<\/p>\n<p>The next step is to configure wireless networking. I&#8217;m using an Edimax USB adapter (EW-7811Un) apparently based on Realtek RTL8188CUS chipset.<\/p>\n<p>The contents of\u00a0<strong>\/etc\/network\/interfaces<\/strong> were left with the Raspbian defaults. However, the settings in <strong>\/etc\/wpa_supplicant\/wpa_supplicant.conf<\/strong>\u00a0needed to be changed to suit my own network, as shown below:<\/p>\n<pre>ctrl_interface=DIR=\/var\/run\/wpa_supplicant GROUP=netdev\nupdate_config=1\n\nnetwork={\n\u00a0\u00a0 \u00a0<strong>scan_ssid=1<\/strong>\n\u00a0\u00a0 \u00a0ssid=\"<strong>yourssid<\/strong>\"\n    psk=<strong>2a1f2e3c8d7f5e4a35c6f4e3d...<\/strong>\n\u00a0\u00a0 \u00a0proto=WPA\n\u00a0\u00a0 \u00a0key_mgmt=WPA-PSK\n\u00a0\u00a0 \u00a0pairwise=CCMP\n\u00a0\u00a0 \u00a0auth_alg=OPEN\n}<\/pre>\n<p>The PSK above is generated by using <strong>wpa_passphrase<\/strong> as follows:<\/p>\n<pre>wpa_passphrase &lt;ssid&gt; &lt;password&gt;<\/pre>\n<p>Since my SSID is hidden, I had to add the <strong>scan_ssid <\/strong>setting to make it find the network. Without this, it gives loads of errors about DHCP discover failing.<\/p>\n<p>Another problem I have had a few times is that if you make small typo in the wpa_supplicant file, it will fail to start with error 1.<\/p>\n<p>Having changed the settings, I restarted the wireless network as follows:<\/p>\n<pre>sudo ifdown wlan0\nsudo ifup wlan0<\/pre>\n<p>This got it up and running on the network, and then I was able to SSH into the Pi.<\/p>\n<p>Next I decided to try an update as follows:<\/p>\n<pre>sudo apt-get update\nsudo apt-get upgrade<\/pre>\n<p>As a quick check at this stage:<\/p>\n<pre>uname -r\n4.1.13+<\/pre>\n<h2>Configuring FBTFT for the HY28.<\/h2>\n<p>Next, I decided to install the FBTFT drivers for the LCD display. These are apparently now included in the Raspberry Pi Foundation kernel, so let&#8217;s try updating that:<\/p>\n<pre>sudo rpi-update\nsudo reboot<\/pre>\n<p>Check the version:<\/p>\n<pre>uname -r\n4.1.15+<\/pre>\n<p>Having connected the HY28A TFT LCD to the Pi via the SPI bus, I tried loading the drivers (using the same settings I had backed up from my previous working installation):<\/p>\n<pre># load the driver: the panel goes black\nsudo modprobe fbtft_device name=hy28a rotate=270 gpios=reset:25 fps=20\n# map console to LCD for testing\ncon2fbmap 1 1<\/pre>\n<p>Having done this, the console appeared on the LCD, confirming that it works. I then made it permanent by loading the module from\u00a0<a href=\"http:\/\/www.freedesktop.org\/software\/systemd\/man\/modules-load.d.html\">\/etc\/modules-load.d\/fbtft.conf<\/a><\/p>\n<pre>spi-bcm2835\nfbtft_device<\/pre>\n<p>The\u00a0options are set in\u00a0<a href=\"http:\/\/linux.die.net\/man\/5\/modprobe.d\">\/etc\/modprobe.d\/fbtft.conf<\/a><\/p>\n<pre>options fbtft_device name=hy28a rotate=270 gpios=reset:25 txbuflen=32768 fps=20<\/pre>\n<p>For reference only, the touchpanel driver settings used to be the following in \/etc\/modules (and haven&#8217;t yet been corrected for systemd as I don&#8217;t use them currently):<\/p>\n<pre># Touchpanel driver\nads7846_device pressure_max=255 y_min=190 y_max=3850 gpio_pendown=17 x_max=3850 x_min=230 x_plate_ohms=60 ads7846<\/pre>\n<p>To make the console appear during boot, I added the following to the end of <strong>\/boot\/cmdline.txt<\/strong>. This font seemed the best of the few that I tried.<\/p>\n<pre>fbcon=map:10 fbcon=font:Acorn8x8<\/pre>\n<p>After about 30 minutes, the LCD screen goes blank. To disable this, I changed the BLANK_TIME and POWERDOWN_TIME to zero in <strong>\/etc\/kbd\/config<\/strong>:<\/p>\n<pre># prevent screen blanking\nBLANK_TIME=0\nPOWERDOWN_TIME=0<\/pre>\n<h2>Installing the ADS1015 ADC board<\/h2>\n<p>For Raspbian, we first have to enable I2C by adding the following lines to <strong>\/etc\/modules<\/strong>:<\/p>\n<pre># I2C drivers for ADC board\ni2c-bcm2708\ni2c-dev<\/pre>\n<p>After a reboot, I installed <a title=\"Adafruit configuring I2C\" href=\"https:\/\/learn.adafruit.com\/adafruits-raspberry-pi-lesson-4-gpio-setup\/configuring-i2c\">i2c-tools<\/a> for convenience:<\/p>\n<pre>sudo apt-get install python-smbus\nsudo apt-get install i2c-tools<\/pre>\n<p>Having done this, the following can be used to detect I2C devices:<\/p>\n<pre>sudo i2cdetect -y 1\n# for older Raspberry Pi boards:\n# sudo i2cdetect -y 0<\/pre>\n<p>For my Pi, the ADS1015 appears as address <strong>0x48<\/strong> on <strong>\/dev\/i2c-1<\/strong>. Having confirmed this, I wrote a small command-line test program to check that the ADC was working and returning voltage readings.<\/p>\n<p>With my buttons wired to the ADC via a resistor ladder, this was an opportunity to check that they worked as planned. With various button combinations, I obtained the following readings:<\/p>\n<ul>\n<li>No buttons = 3.30V<\/li>\n<li>Lower button = 2.18V<\/li>\n<li>Upper button = 1.65V<\/li>\n<li>Both buttons = 1.31V<\/li>\n<\/ul>\n<h2>Problem 1 (solved?): Wireless disconnects<\/h2>\n<p>After using this for a while, I started having problems with the wireless going down, usually half-way through editing a file over SSH. I seem to remember having this issue before and fixing it with some changes to disable power management in the boot command-line&#8230; but couldn&#8217;t remember the details.<\/p>\n<p>Based on something I read <a title=\"Edimax EW-7811Un Disconnect issue\" href=\"http:\/\/www.raspberrypi.org\/forums\/viewtopic.php?f=26&amp;t=44310http:\/\/\" target=\"_blank\" rel=\"noopener\">here<\/a>, I decided to try adding this to <strong>\/etc\/network\/interfaces<\/strong>:<\/p>\n<pre>wireless-power off<\/pre>\n<p>After some time, it became evident that this hadn&#8217;t solved the problem. I&#8217;m pretty sure it&#8217;s not the power supply, as it worked fine on this PSU for about a year until the re-install.<\/p>\n<p>Anyway, in desperation I added a 100uF low ESR electrolytic between 5V and GND (can&#8217;t hurt!), and also tried re-positioning the wifi adapter to have a clear line of sight to the router.<\/p>\n<p>This didn&#8217;t solve the problem either, although it did stop the Pi from rebooting when the wifi dongle is inserted (the network doesn&#8217;t come back up if you do this though..)<\/p>\n<p>For my next attempt, I tried setting the USB speed down to V1 to see if that helped (better to have a slow connection than an unreliable one&#8230;)<\/p>\n<pre>dwc_otg.speed=1<\/pre>\n<p>This seemed to improve matters at first, but after extended use it still seems unreliable. The next thing I tried was <a title=\"Is your Edimax EW-7811Un wifi dongle dropping connection?\" href=\"http:\/\/forum.osmc.tv\/showthread.php?tid=9032\" target=\"_blank\" rel=\"noopener\">this suggestion<\/a> to create a configuration file at\u00a0<strong>\/etc\/modprobe.d\/8192cu.conf<\/strong> to disable power management:<\/p>\n<pre>options 8192cu rtw_power_mgnt=0 rtw_enusbss=0<\/pre>\n<p>For good measure, I&#8217;ve also added this to <strong>\/boot\/cmdline.txt<\/strong> (which actually seems familiar, and might be what solved this problem before):<\/p>\n<pre>smsc95xx.turbo_mode=N<\/pre>\n<p>Finally, I&#8217;ve increased the minimum reserve virtual memory in <strong>\/etc\/sysctl.conf<\/strong> as I seem to remember doing that last time:<\/p>\n<pre>vm.min_free_kbytes = 16384<\/pre>\n<p>This is really starting to become annoying now. I&#8217;ve spent more time rebooting and messing with the wireless than working on the project.<\/p>\n<p>Update: this seems more stable now. I think one of the last two steps must have been the real solution!<\/p>\n<h2>Installing LIBSDL<\/h2>\n<p>I&#8217;m using the SDL 1.2 library for graphics on the TFT display, as well as the SDL TTF library for font rendering, and SDL image library. These are installed as follows:<\/p>\n<pre>sudo apt-get update\nsudo apt-get install libsdl1.2-dev libsdl-ttf2.0-dev libsdl-image1.2-dev<\/pre>\n<h2>Installing\u00a0pigpio<\/h2>\n<p>Es(pi)resso used to use kernel mode drivers for the <a title=\"Linux Kernel Module for the TSIC 306\" href=\"https:\/\/code.google.com\/p\/tsic-kernel\/\" target=\"_blank\" rel=\"noopener\">TSIC 306 Temperature Sensor<\/a> and the <a title=\"HCSR-04 Range Finder Kernel Driver\" href=\"https:\/\/code.google.com\/p\/hcsr04-kernel\/\" target=\"_blank\" rel=\"noopener\">HCSR-04 Ultrasonic Range Finder<\/a>. The problem is that these needed to be rebuilt when the kernel was updated, and this isn&#8217;t easy to do on the Pi (I only managed to build these via cross-compilation from Ubuntu on a PC).<\/p>\n<p>Having recently discovered the <a title=\"PIGPIO\" href=\"http:\/\/abyz.co.uk\/rpi\/pigpio\/\" target=\"_blank\" rel=\"noopener\">PIGPIO<\/a>\u00a0library, I decided to move\u00a0to user mode drivers implemented with pigpio. This is\u00a0obviously more convenient as it avoids the need to rebuild kernel modules and makes a self contained project.<\/p>\n<p>The first step is to install pigpio as follows:<\/p>\n<pre>wget abyz.co.uk\/rpi\/pigpio\/pigpio.zip\nunzip pigpio.zip\ncd PIGPIO\nmake\nmake install<\/pre>\n<p>Having done this, I rewrote the code to use <a title=\"PIGPIO\" href=\"http:\/\/abyz.co.uk\/rpi\/pigpio\/\" target=\"_blank\" rel=\"noopener\">PIGPIO<\/a>. In the first instance, I tried using the functions directly from pigpio.h. However, I ran into all sorts of mysterious crashes at start up. After some debugging, my theory\u00a0was that this might be due to the use of static variables in both pigpio and in my own code, potentially resulting in undefined order of initialisation at start up. Consequently, I rewrote the code to use the <a title=\"PIGPIOD\" href=\"http:\/\/abyz.co.uk\/rpi\/pigpio\/pigpiod.html\" target=\"_blank\" rel=\"noopener\">PIGPIOD <\/a>daemon instead (via the <a title=\"pigpiod_if\" href=\"http:\/\/abyz.co.uk\/rpi\/pigpio\/pdif.html\" target=\"_blank\" rel=\"noopener\">pigpiod_if<\/a> functions), and this works fine.<\/p>\n<p>Almost all the GPIO is now moved to PIGPIOD, with the exception of the hardware PWM which has been retained for the boiler power regulation (primarily because of the very low PWM frequency used).<\/p>\n<h2>Check out and configure the Es(pi)resso software<\/h2>\n<p>Now we have the dependencies, the software needs to be checked out from Subversion:<\/p>\n<pre>sudo apt-get update\nsudo apt-get install subversion\nmkdir sandbox\ncd sandbox\nsvn checkout https:\/\/github.com\/jam3sward\/espiresso.git\/trunk gaggia<\/pre>\n<p>There is no configuration, so the software should just build like this:<\/p>\n<pre>make<\/pre>\n<p>It can be installed to \/usr\/local\/bin as follows:<\/p>\n<pre>sudo make install<\/pre>\n<p>Every time it runs, the controller software creates log files at <strong>\/var\/log\/gaggia<\/strong>. This folder must be created manually as follows:<\/p>\n<pre>sudo mkdir \/var\/log\/gaggia<\/pre>\n<p>There is also a configuration file with the PID controller parameters and other settings. From the project directory, this is copied to <strong>\/etc\/gaggia.conf<\/strong> as follows:<\/p>\n<pre>sudo cp gaggia.conf \/etc<\/pre>\n<p>There are some PNG images (used to display icons on the LCD) which need to be installed in <strong>\/etc\/gaggia<\/strong> as follows:<\/p>\n<pre>sudo mkdir \/etc\/gaggia\nsudo cp images\/*.png \/etc\/gaggia\nls \/etc\/gaggia<\/pre>\n<p>At this point, the software can be started in interactive mode by adding the\u00a0<strong>-i<\/strong> parameter. This displays output in the console and allows the software to be stopped by pressing a key.<\/p>\n<pre>sudo .\/gaggia start -i<\/pre>\n<p>Assuming this works, the LCD display should show the current temperature, water level etc.<\/p>\n<h2>\u00a0Problem 2 (solved): GPIO\u00a0initialisation at boot time<\/h2>\n<p>The Raspberry Pi was initialising GPIO15 (RXD) as pull-up at power on. In early testing, this resulted in the pump being switched on when the system was powered up!<\/p>\n<p>To fix this, I used the <a title=\"Device Tree Pin Configuration\" href=\"http:\/\/www.raspberrypi.org\/documentation\/configuration\/pin-configuration.md\" target=\"_blank\" rel=\"noopener\">device tree pin configuration<\/a>\u00a0to change the GPIO pin initial state to an input with pull-down at power on. The pin is later changed to an output by the control software.<\/p>\n<p>First, we check that the Raspberry Pi firmware is later than July 15th 2014:<\/p>\n<pre>vcgencmd version<\/pre>\n<p>Then we install the device tree compiler:<\/p>\n<pre>sudo apt-get update\nsudo apt-get install device-tree-compiler<\/pre>\n<p>Then the device tree source file is needed. This is located in the source code\u00a0tree here:\u00a0<a title=\"dt-blob.dts\" href=\"https:\/\/code.google.com\/p\/espiresso\/source\/browse\/trunk\/gaggia\/dt-blob\/dt-blob.dts\" target=\"_blank\" rel=\"noopener\">gaggia\/dt-blob\/dt-blob.dts<\/a><\/p>\n<p>Finally, the device tree source file is compiled to a binary blob, and copied to the \/boot partition:<\/p>\n<pre>sudo dtc -I dts -O dtb -o \/boot\/dt-blob.bin dt-blob.dts<\/pre>\n<p>Note: on NOOBS this file apparently <a href=\"https:\/\/www.raspberrypi.org\/documentation\/configuration\/pin-configuration.md\" target=\"_blank\" rel=\"noopener\">has to be on the recovery\u00a0partition<\/a>.<\/p>\n<p>When the system is rebooted, the GPIO pin comes up as a pull-down, and the pump sits idle until the controller is ready to power it on.<\/p>\n<h2>Faster boot times<\/h2>\n<p>In an attempt to make it boot up faster and reduce writes to the SD card, I made the following changes to <strong>\/boot\/cmdline.txt<\/strong>:<\/p>\n<ol>\n<li>Removed\u00a0<strong>console=tty1<\/strong><\/li>\n<li>Added <strong>noatime nodiratime<\/strong><\/li>\n<li>Added <strong>quiet<\/strong><\/li>\n<\/ol>\n<p>The current <strong>\/boot\/cmdline.txt<\/strong> looks like this:<\/p>\n<pre>dwc_otg.lpm_enable=0 root=\/dev\/mmcblk0p7 rootfstype=ext4 elevator=deadline noatime nodiratime fsck.repair=yes rootwait quiet smsc95xx.turbo_mode=N fbcon=map:10 fbcon=font:Acorn8x8<\/pre>\n<h2>Running the controller automatically at start up<\/h2>\n<p>To make the software run automatically at start up, I created two scripts under <strong>\/etc\/init.d<\/strong>. One, called <strong>pigpiod<\/strong> is used to start the <strong>pigpio<\/strong> daemon. The other, called <strong>gaggia<\/strong>, is used to start the controller.<\/p>\n<p>These are installed as follows:<\/p>\n<pre># copy the executable to \/usr\/local\/bin\nsudo cp gaggia \/usr\/local\/bin\n\n# copy the scripts into \/etc\/init.d\nsudo cp scripts\/gaggia \/etc\/init.d\/gaggia\nsudo cp scripts\/pigpiod \/etc\/init.d\/pigpiod\nsudo chmod +x \/etc\/init.d\/gaggia\nsudo chmod +x \/etc\/init.d\/pigpiod\n\n# install the scripts\nsudo update-rc.d gaggia defaults\nsudo update-rc.d pigpiod defaults<\/pre>\n<p>When the machine starts, the <strong>pigpiod<\/strong> daemon is initialised first, followed by the <strong>gaggia<\/strong> controller. This enables the machine to automatically start when powered on.<\/p>\n<p>Button 2 on the front panel can later be used to safely shut down the Pi (by pressing for more than 2 seconds).<\/p>\n<p>Another way to shut down the controller is to log in remotely, and type:<\/p>\n<pre>sudo \/etc\/init.d\/gaggia stop<\/pre>\n<p>Furthermore, holding Button 2 as the system boots will prevent the controller from starting up. This is useful when the machine is being powered on for maintenance or development.<\/p>\n<h2>\u00a0Installing\u00a0Samba<\/h2>\n<p>Installing Samba makes it possible to\u00a0access the\u00a0log files over the local network, and is also generally useful for transferring files. The first step is to install Samba itself:<\/p>\n<pre>sudo apt-get update\nsudo apt-get install samba samba-common-bin<\/pre>\n<p>Make a backup of the original <strong>smb.conf<\/strong> configuration file, and edit the file:<\/p>\n<pre>sudo cp \/etc\/samba\/smb.conf \/etc\/samba\/smb.conf.$(date +%F)\nsudo nano \/etc\/samba\/smb.conf<\/pre>\n<p>In my case, I commented out the <strong>[printers]<\/strong> section and the <strong>[print$]<\/strong> section, and\u00a0added the following section to make the log files visible:<\/p>\n<pre>[logs]\ncomment = Logs\npath = \/var\/log\/gaggia\nbrowseable = yes\nonly guest = yes\nread only = yes\npublic = yes<\/pre>\n<p>Finally, the configuration can be tested, and the Samba service restarted as follows:<\/p>\n<pre>testparm\nsudo service smbd restart\nsudo service nmbd restart<\/pre>\n<p>Installing Samba has the added bonus of making it possible to SSH to the Pi using the host name, rather than having to use the IP address.<\/p>\n<h2>Problem 3 (solved?): SD card corruption<\/h2>\n<p>Having got\u00a0everything working really well&#8230; it just stopped booting. Connecting the Pi to my TV with HDMI, I found that it was failing early in the boot process with a kernel panic, complaining over a missing file-system. Turns out\u00a0the SD card was corrupted. No idea how that happened.<\/p>\n<p>After some initial panic, I managed to repair\u00a0the SD card from a PC running Ubuntu using\u00a0<strong>fsck.ext4<\/strong>\u00a0something like this:<\/p>\n<pre><code><strong>NOTE:<\/strong> <strong>mmcblk0p2<\/strong> will probably need to be changed on your PC\nsudo fsck.ext4 -v \/dev\/mmcblk0p2\n<\/code><\/pre>\n<p>After rebooting the Pi, fsck ran again. It actually seemed to crash fsck itself and streamed out pages and pages of junk on-screen. I just left it to see what happened and it eventually came up and started working again.<\/p>\n<p>I&#8217;m now thinking of making the SD card read only and moving the file system to USB to improve reliability.<\/p>\n<h2>Problem 4 (solved?): Display reliability<\/h2>\n<p>Although the display has been running fine for several months, I recently found it started behaving erratically. The first issue was that it would sometimes randomly shift the display vertically (i.e. as if it was scrolled, with wrap around). Eventually, I found that I just got a white screen at boot.<\/p>\n<p>Having eliminated the obvious things like checking the settings in\u00a0<strong>\/etc\/modules<\/strong>\u00a0and the wiring, I decided to try reducing the speed from 32MHz to 16MHz, which seemed to cure the white screen:<\/p>\n<pre>fbtft_device name=hy28a rotate=270 gpios=reset:25 speed=16000000 fps=20<\/pre>\n<p>Since the display was working fine at 32MHz for a long time, I can only conclude that this might be due to poor contact in the connectors or wiring (I&#8217;ve removed and reconnected the headers many times), or it could be related to FBTFT competing with PIGPIO, which is running a lot of DMA and using 9% CPU. Either way, I&#8217;ll see how well the display performs at 16MHz, in the absence of a better solution.<\/p>\n<h2>Disable swapfile<\/h2>\n<p>How to disable the swap file:<\/p>\n<pre>sudo swapoff --all\nsudo apt-get remove dphys-swapfile<\/pre>\n<h2>Installing Busybox syslogd<\/h2>\n<p>I decided to install Busybox syslogd (which logs to a circular buffer), hopefully reducing SD card activity:<\/p>\n<pre>sudo apt-get install busybox-syslogd\nsudo dpkg --purge rsyslog\nlogread<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Having corrupted my SD card again (deep sigh), it&#8217;s time for a complete rebuild again. I thought this would be an opportunity to update these notes. The first task is to download an image and write to an SD card. Previously\u00a0I downloaded Raspbian (Kernel 3.12, Release 2014-12-24) from raspberrypi.org. I used Win32DiskImager to write this &hellip; <a href=\"https:\/\/int03.co.uk\/blog\/raspberry-pi-espresso-cpu-from-scratch\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Raspberry Pi Espresso CPU&#8230; from scratch<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":75,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":{"footnotes":""},"_links":{"self":[{"href":"https:\/\/int03.co.uk\/blog\/wp-json\/wp\/v2\/pages\/223"}],"collection":[{"href":"https:\/\/int03.co.uk\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/int03.co.uk\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/int03.co.uk\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/int03.co.uk\/blog\/wp-json\/wp\/v2\/comments?post=223"}],"version-history":[{"count":31,"href":"https:\/\/int03.co.uk\/blog\/wp-json\/wp\/v2\/pages\/223\/revisions"}],"predecessor-version":[{"id":805,"href":"https:\/\/int03.co.uk\/blog\/wp-json\/wp\/v2\/pages\/223\/revisions\/805"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/int03.co.uk\/blog\/wp-json\/wp\/v2\/media\/75"}],"wp:attachment":[{"href":"https:\/\/int03.co.uk\/blog\/wp-json\/wp\/v2\/media?parent=223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}